3

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.

1 Answer 1

7

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 
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.