[Django]-Django REST Framework serializer field required=false

60👍

Yeah, I ran into this issue at some point as well. You need to also update the validation exclusions.

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList

    def get_validation_exclusions(self):
        exclusions = super(FavoriteListSerializer, self).get_validation_exclusions()
        return exclusions + ['owner']

41👍

Late Entry to this thread. This issue was fixed in django-rest-framework 2.3.13. Here is the link of the PR.

You use it like this in your case:

    class Meta:
        model = models.FavoriteList
        optional_fields = ['owner', ]

37👍

In case somebody lands here with a similar issue, pay attention to the following attributes along with required:

allow_blank:

If set to True then the empty string should be considered a valid value.

allow_null:

Normally an error will be raised if None is passed to a serializer field.

required:

Normally an error will be raised if a field is not supplied during deserialization.

I was straggling to figure out why I was getting a validation error with required=False where I had missed the allow_null attribute.

👤Wtower

22👍

In 2020, for DRF 3.12.x, the approach that I prefer the approach that relies on
Serializer’s extra_kwargs.

So assuming your

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList
        fields = ["owner"]  # and whatever other fields you want to expose
        extra_kwargs = {"owner": {"required": False, "allow_null": True}}

4👍

If you have unique_together constraint on one of the fields you are trying to set required=False you need to set validators=[] in serializers Meta like

class FavoriteListSerializer(serializers.ModelSerializer):
    owner = serializers.IntegerField(required=False)
    class Meta:
        model = models.FavoriteList
        validators = []

Here is the original answer

1👍

You can also do this:

class ASerializer(serializers.HyperlinkedModelSerializer): 
    owner = serializers.HiddenField(default=serializers.CurrentUserDefault())

    ...

As referred here: https://www.django-rest-framework.org/api-guide/validators/#advanced-field-defaults
There you can also find the case when you also wanna let the view show owner

0👍

I would set model field to allow null value (and possible also default to None)

class FavoriteList(models.Model):
    owner = models.PositiveIntegerField(null=True, default=None)

Then it’s possible to just leave owner field to Meta section. These fields, without any extra settings, will automatically get all attributes from model field and be non-required.

class FavoriteListSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.FavoriteList
        fields = ('owner',)
👤TCFDS

Leave a comment