Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django.db.utils.IntegrityError:在序列化程序上调用my.save()函数时,唯一约束失败_Python_Django_Database_Constraints - Fatal编程技术网

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

Python django.db.utils.IntegrityError:在序列化程序上调用my.save()函数时,唯一约束失败,python,django,database,constraints,Python,Django,Database,Constraints,因此,我创建了一个singleton类来在我的服务器上存储一个文件,该文件在每次添加新文件时都会被替换,但每当我尝试将一个新文件发布到我的上载端点时,我都会遇到以下错误,并且我将其范围缩小到调用file_serializer.save()时 sqlite3.IntegrityError:唯一约束失败:api\u app\u onixfile.id Models.py class SingletonModel(models.Model): class Meta: abst

因此,我创建了一个singleton类来在我的服务器上存储一个文件,该文件在每次添加新文件时都会被替换,但每当我尝试将一个新文件发布到我的上载端点时,我都会遇到以下错误,并且我将其范围缩小到调用file_serializer.save()时

sqlite3.IntegrityError:唯一约束失败:api\u app\u onixfile.id

Models.py

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

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)
序列化程序.py

from rest_framework import serializers
from .models import OnixFile

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

我假设我的SingletonModel保存函数将通过用新信息覆盖当前函数来处理无法拥有唯一PK的事实。

因为您正在将数据发布并传递到序列化程序中,它正试图创建一个新的
OnixFile
。这意味着当序列化程序调用
save()
时,它试图将这个新的
OnixFile
实例的
id
设置为
1
,这很可能是您现有的单例实例所采用的

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

def post(self、request、*args、**kwargs):
#请随意使用“first()”或在此处执行其他检查,以防您
#有一个案例,其中单例可能不存在。
singleton_instance=OnixFile.objects.get(id=1)
file_serializer=XMLFileSerializer(instance=singleton_instance,data=request.data)
如果(文件\u序列化程序.is\u valid()):
...