首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django.db.utils.IntegrityError:在序列化程序上调用我的.save()函数时唯一约束失败

django.db.utils.IntegrityError:在序列化程序上调用我的.save()函数时唯一约束失败
EN

Stack Overflow用户
提问于 2020-02-10 21:58:57
回答 1查看 1.9K关注 0票数 1

因此,我创建了一个单例类,用于在服务器上存储一个文件,每次添加新文件时都会被替换,但是每当我试图将一个新文件发布到我的上传端点时,我就会得到以下错误,并将其缩小到调用file_serializer.save()时。

sqlite3.:唯一约束失败: api_app_onixfile.id

Models.py

代码语言:javascript
复制
class SingletonModel(models.Model):

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        self.pk = 1
        super(SingletonModel, self).save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        pass

    @classmethod
    def load(cls):
        obj, created = cls.objects.get_or_create(pk=1)
        return obj

class OnixFile(SingletonModel):
    onix_file = models.FileField(blank=False, null=False, validators=[validate_xml])
    def __str__(self):
        return self.onix_file.name 

Views.py

代码语言:javascript
复制
from django.shortcuts import render
from rest_framework.parsers import FileUploadParser
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from .serializers import XMLFileSerializer
from .models import OnixFile
import onixcheck
from .utils import OnixParser
from django.http import JsonResponse


class FileUploadView(APIView):
    parser_class = (FileUploadParser,)

    def post(self, request, *args, **kwargs):


        file_serializer = XMLFileSerializer(data=request.data)

        if(file_serializer.is_valid()):

            onix_file = request.data['onix_file']
            onix_errors = onixcheck.validate(onix_file)
            if len(onix_errors) > 0:
                file_serializer.save()
                print("Onix Errors")
                return Response(onix_errors, status=status.HTTP_400_BAD_REQUEST)

            else:
                file_serializer.save()
                print(OnixFile.load())
                return Response(OnixFile.load().__str__(), status=status.HTTP_201_CREATED)

        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Serializers.py

代码语言:javascript
复制
from rest_framework import serializers
from .models import OnixFile

class XMLFileSerializer(serializers.ModelSerializer):
    class Meta:
        model = OnixFile
        fields = "__all__"

我假设我的SingletonModel保存函数将处理这样一个事实:我不能通过用新信息覆盖当前函数来拥有唯一的PK。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-10 22:14:06

因为您是在向序列化程序发送和传递数据,所以它试图创建一个新的OnixFile。这意味着当序列化程序调用save()时,它试图将这个新OnixFile实例的id设置为1,这很可能是由您现有的单例实例获取的。

如果您希望用新数据更新您的单例,我建议将一个instance传递到序列化程序中。这样,序列化程序将尝试更新该实例,您可以保存更新,而不是尝试创建一个新实例:

代码语言:javascript
复制
    def post(self, request, *args, **kwargs):
        # Feel free to use `first()` or do some other check here in case you
        # have a case where the singleton might not exist.
        singleton_instance = OnixFile.objects.get(id=1)
        file_serializer = XMLFileSerializer(instance=singleton_instance, data=request.data)

        if(file_serializer.is_valid()):
            ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60159067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档