Tengo un modelo de productos en el que quiero tener campos opcionales que el usuario no requiere cada vez que intento ingresar datos vacíos, arroja un error 400 al usuario, lo que significa que los datos serializados no son válidos
vistas.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)serializador.py
class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = '__all__'modelos.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)La forma en que DRF entiende qué campo se requiere es mirando la opción de su campo de modelo llamada null ( docs ).
Si null=True , DRF manejará este campo como no requerido
Si no desea configurar esta opción en la clase de su modelo, puede hacer que funcione en la clase de serializador a través de la opción required , por ejemplo
class ProductSerializer(serializers.ModelSerializer): name = serializer.CharField(required=False) class Meta: model = Product fields = '__all__'Tienes que especificar los campos explícitamente y agregar required=false así:
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}}