Есть ли способ разрешить пустые данные для Django restframework

У меня есть модель продуктов, в которой я хочу иметь необязательные поля, которые не требуются пользователю. Всякий раз, когда я пытаюсь ввести пустые данные, пользователю выдается ошибка 400, означающая, что сериализованные данные не действительны

views.py

def products(request):
    if request.method == 'GET':
        products = Product.objects.filter(user=request.user)
        serializer = ProductSerializer(products, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = ProductSerializer(data=request.data)
        serializer.initial_data['user'] = request.user.pk
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializer.py

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

models.py

class Product(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField(blank=True)
    price = models.FloatField()
    quantity = models.IntegerField(blank=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    shop = models.ForeignKey(Shop, on_delete=models.DO_NOTHING)
    discount = models.FloatField(default=0)

Способ, которым DRF понимает, какое поле требуется, заключается в просмотре опции поля вашей модели под названием null (docs).

Если null=True, DRF будет обрабатывать это поле как необязательное

Если вы не хотите устанавливать эту опцию в классе вашей модели, вы можете заставить ее работать в классе сериализатора через required option, например

class ProductSerializer(serializers.ModelSerializer):
    name = serializer.CharField(required=False)

    class Meta:
        model = Product
        fields = '__all__'

Вы должны указать поля явно и добавить required=false следующим образом :

class ProductSerializer(serializers.ModelSerializer):
    # We make the description field empty
    description = serializers.CharField(max_length=200, required=False)
    class Meta:
        model = Product
        fields = ['name', 'description', 'user' , 'shop' ...] # Each field you want in the response.
        # Or you can use extra_kwargs since DRF 3.12.x
        extra_kwargs = {"description": {"required": False, "allow_null": True}}
Вернуться на верх