Search code examples
djangodjango-rest-framework

Django Rest Framework ignores default value


Any idea why does Django Rest Framework ignore default values?

class MyClass(models.Model):
    some_field = models.CharField(default='Yes')

class MyClassSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyCLass
        fields = ['some_field']

class MyClassListCreateAPIView(ListCreateAPIView):
    queryset = MyClass.objects.all()
    serializer_class = MyClassSerializer

When I send {'some_field': None} /null/something like this. I always get:

Bad Request: /myurl/
[02/Dec/2022 16:44:59] "POST /myurl/ HTTP/1.1" 400 114

When changed to:

class MyClass(models.Model):
        some_field = models.CharField(default='Yes', blank=True, null=True)

it works but always sets the NULL value. Is this expected behaviour? Should I change the mechanics of my POST request to include changing value to default when user doesn't provide one?


Solution

  • I believe this is a minor misconception.

    Posting {'some_field': None} to your API is informing your Serializer to manufacture a MyClass instance with some_field set to None- not to use the default. It is not using the default value- because you're instantiating it with a value of None.

    If you want to use the default value on your model- you need to clean/remove the some_field value during serializer Validation so that the create() call does not have this field present- and the default will be used.

    Should I change the mechanics of my POST request to include changing value to default when user doesn't provide one?

    This would certainly be a solution and would work. But unless this is well documented- outside consumers of your API may notice the same odd behavior.