Почему метод clean () моделей django не работает - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь перезаписать значение поля DateField, если оно пустое. Как обычно, поле с этим типом не проверяется во время сериализации, если значение не является объектом класса datetime. Мне нужно написать ноль в базу данных, если значение пусто. Для этого я пытаюсь изменить метод модели clean ().

serializer.py

class VendorsSerializer(serializers.ModelSerializer):
    contacts = VendorContactSerializer(many=True)

    class Meta:
        model = Vendors
        fields = (...
                  'nda',
                  'contacts',)


    def create(self, validated_data):
        contact_data = validated_data.pop('contacts')
        vendor = Vendors.objects.create(**validated_data)
        vendor.full_clean()
        for data in contact_data:
            VendorContacts.objects.create(vendor=vendor, **data)
        return vendor

models.py

class Vendors(models.Model):
    ...
    nda = models.DateField(blank=True, null=True)

        def clean(self):
        if self.nda == "":
            self.nda = None

view.py

class VendorsCreateView(APIView):
    """Create new vendor instances from form"""
    permission_classes = (permissions.AllowAny,)
    serializer_class = VendorsSerializer

    def post(self, request, *args, **kwargs):
        serializer = VendorsSerializer(data=request.data)
        try:
            serializer.is_valid(raise_exception=True)
            serializer.save()
        except ValidationError:
            return Response({"errors": (serializer.errors,)},
                            status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(request.data, status=status.HTTP_200_OK)

Почему clean() не работает?

json

{
    "vendor_name": "The Greey swAlsbudam2",
    "country": "Belgium",
    "nda": "",
    "contacts": [{"contact_name": "Mrk", "phone": "2373823", "email": "ryryr@gmail.com"},
            {
            "contact_name": "Uio",
            "phone": "34567",
            "email": "ryfhhryr@gmail.com"
        }
    ]


}

1 Ответ

1 голос
/ 09 марта 2020

Поскольку вы создаете экземпляр перед вызовом full_clean здесь

vendor = Vendors.objects.create(**validated_data)
vendor.full_clean()

Первая строка создает объект в базе данных (с пустой строкой). Вторая строка выполняет очистку, но не сохраняет снова в базе данных. Вы должны выполнить очистку перед сохранением.

vendor = Vendors(**validated_data)
vendor.full_clean()
vendor.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...