Use the partial=True attribute of the serializer.

Like below:

evs = EventSerializer(ev, data={title="Event Title"}, partial=True)

Full Example

class Event(models.Model):
    title = models.CharField(max_length=100)
    description = models.CharField(
        max_length=255, null=False, blank=False, default="Your description"
    )
 
 
class EventSerializer(serializers.ModelSerializer):
	class Meta:
        model = Event
        fields = [
            "title",
            "description",
        ]
    def validate_title(self, value):
        print("validate_title")
 
    def validate_description(self, value):
        print("validate_description")
        
	def validate(self, value):
        print("validate")
        

And then calling serializer is_valid() like below:

ev = Event.objects.first()
Event.objects.filter(pk=ev.pk).update(description="")
 
ev.refresh_from_db()
 
evs = EventSerializer(ev, data={})
# evs = EventSerializer(ev, data={title="a title"}, partial=True)
 
print(evs.is_valid())
  • validate_title() is not called if title is not present in data or if the value of title is not truthy
  • validate() is always called
  • if any of validate_<field>() returns ValidationError, then validate() is not called

References

None