django .db.utils.IntegrityError: Не удалось выполнить ограничение UNIQUE при вызове моей функции .save () на сериализаторе - PullRequest
0 голосов
/ 11 февраля 2020

Итак, я создал одноэлементный класс для хранения файла на моем сервере, который заменяется при каждом добавлении нового файла, но я получаю следующую ошибку, когда пытаюсь опубликовать новый файл в моей конечной точке загрузки. и я сузил его до того, когда я вызываю file_serializer.save ()

sqlite3.IntegrityError: сбой ограничения UNIQUE: api_app_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)

Serializers.py

from rest_framework import serializers
from .models import OnixFile

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

Я предполагал, что моя функция сохранения SingletonModel будет обрабатывать тот факт, что у меня не может быть уникального ПК перезаписав текущую функцию новой информацией.

1 Ответ

0 голосов
/ 11 февраля 2020

Поскольку вы публикуете и передаете данные в сериализатор, он пытается создать новый OnixFile. Это означает, что когда сериализатор вызывает save(), он пытается установить для id этого нового экземпляра OnixFile значение 1, которое, вероятно, используется вашим существующим экземпляром синглтона.

Если вы Я бы предпочел обновить ваш синглтон новыми данными, вместо этого я бы предложил передать instance в сериализатор. Таким образом, сериализатор попытается обновить этот экземпляр, и вы можете сохранить обновление вместо попытки создать новое:

    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()):
            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...