Есть ли способ разрешить пустые данные для 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}}