Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

POST on ModelViewSet with nested object Django Rest Framework

I'm building an API with the django rest framework. I have these models:

class Organisme(models.Model):
    nom = models.CharField(max_length=255)
    adresse = models.ForeignKey(Adresse, on_delete=models.CASCADE)

class Adresse(models.Model):
    rue = models.CharField(max_length=255, blank=True)

This is the view for my mode Organisme :

class OrganismeViewSet(viewsets.ModelViewSet):
    queryset = Organisme.objects.all()
    serializer_class = OrganismeSerializer
    pagination_class = StandardResultsSetPagination
    filter_backends = (filters.SearchFilter, DjangoFilterBackend)
    filter_class = OrganismeFilter
    search_fields = ('nom')

And my serializer:

class OrganismeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Organisme
        fields = '__all__'
        depth = 1

So I'm trying to create a new Organisme by sending this:

{
    "adresse": {
        "rue": "test"
    },
    "nom":"TestTest",
}

or

{
    "adresse": pk_id,
    "nom":"TestTest",
}

But I always end up with this error:

IntegrityError at /organismes/
(1048, "Column 'adresse_id' cannot be null")

If you guys know how to proceed... Thank you in advance.

like image 356
Jérémy Octeau Avatar asked Dec 17 '25 19:12

Jérémy Octeau


1 Answers

You need to override create method to make writable nested serializer:

class AddressSerializer(serializers.ModelSerializer):
    class Meta:
        model = Addresse
        fields = ('rue',)

class OrganismeSerializer(serializers.ModelSerializer):
    addresse = AddressSerializer()

    class Meta:
        model = Organisme
        fields = '__all__'

    def create(self, validated_data):
        address_data = validated_data.pop('adresse')
        address = Adresse.objects.create(**address_data)
        organism = Organisme.objects.create(address=address, **validated_data)
        return organism 
like image 111
neverwalkaloner Avatar answered Dec 19 '25 09:12

neverwalkaloner



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!