use create_serializer inside another create_serializer in drf

Viewed 29

I've three models:

class Person(models.Model):
    name = models.CharField(max_length=255)
    age = models.IntegerField()

class OrganisationBenefits(models.Model):
    person = models.Foreignkey(Person, on_delete=models.CASCADE)
    benefits = models.CharField(max_length=255)

class ProjectsInvolved(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    projects = models.CharField(max_length=255)

I'm getting data from frontend as:

{
"name": "John Doe",
"age": "30",
"organisation_benefits": [
    {
        "benefits": "dummy"
    },
    {
        "benefits": "dummy" 
    }
],
"projects_involved": [
    {
        "project": "dummy",
  
    },
    {
        "project": "Dummy"
    }
]}

I'm getting data(request.data) from my views into my serializer as validated_data. The serializer looks something like this:

class PersonDetailsCreateSerializer(serializers.ModelSerializer):

    benefits = serializers.ListField(required=False)
    projects = serializers.ListField(required=False)

    class Meta:
        model = Person
        fields = '__all__' 

    def create(self, validated_data):
        benefits = validated_data.pop('benefits')
        projects = validated_data.pop('projects')

        person = person.objects.create(**validated_data)
        for benefit in benefits:
            benefit.update({'person': person})
    
        serializer_benefit = BenefitCreateSerializer(data=benefits, many=True)
        if serializer.is_valid():
            serializer.save()

        for project in projects:
            project.update({'person': person})

        serializer_project = ProjectCreateSerializer(data=projects, many=True)
        if serialzer_project.is_valid():
            serializer_project.save()

        return person

Is this the right approach? Because only person instance is getting created but not benefits and projects. I'm not even sure if I can call another create serializer inside def create() of another serializer. I'm confused at this moment. Instead of this, when I use a for loop and call Model_name.objects.create(), its working as per my expectations. But don't want to user a for loop.

Any help would be much appreciated.

0 Answers
Related