'Override create() method in ModelSerializer and get object by ID (Django 3.2)

Main Model

class Main(models.Model): 
   title = models.CharField(max_length=255) 
   event = models.ForeignKey('Event', null=True, on_delete=models.CASCADE)

Event Model

class Event(models.Model):
   day = models.DateField(u'Day of the event', help_text=u'Day of the event', null=True)

JSON Structure example:

{    
   "titre": "main",
   "event": {
        "id": 13, #can't filter or get object by id
        "day": "2022-01-30"
    }
}

Override create() in Serializer:

class MainSerializer(serializers.ModelSerializer): 
    event = EventSerializer()

    class Meta: 
        model = Main
        fields = '__all__'

    def create(self, validated_data):
        event_data = validated_data.pop('event')
        event = Event.objects.get(id=event_data['id'])
        main = Main.objects.create(event=event, **validated_data)
        return main

Event Serializer:

class EventSerializer(serializers.ModelSerializer): 

class Meta: 
    model = Event
    fields = '__all__'

So I encounter an error "KeyError id" and I can't add the object.



Solution 1:[1]

The solution was quite simple : just add this line to the EventSerializer

id = serializers.IntegerField(required=False)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 bAbdenour