0

I am trying to create a list of related or parent objects while creating a child object in django rest framework.

My Models are like this  

class Model2(models.Model):
    model1 = models.ForeignKey(Model1)
    name = models.CharField(max_length=100)
    display_name = models.CharField(max_length=100)

class Model3(models.Model):
    model1 = models.ForeignKey(Model1)
    kind = models.ForeignKey(Kind)
    model2 = models.ForeignKey(Model2)

and My Serializer classes are :

class Model2Serializer(serializers.ModelSerializer):
    class Meta:
        model = Model2

class Model3Serializer(serializers.ModelSerializer):
    model2 = Model2Serializer(many=True)
class Meta:
    model = Model3
    fields = ('model1', 'model2')

My View is like :

class Model3View(generics.CreateAPIView):  
    serializer_class = Model3Serializer
    queryset = Model3.objects.all()

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # self.perform_create(serializer)
        print serializer.data
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

I am sending a list of objects in the field name model2.

model2 field in request.data is like

[
    {
        "name":"abcde",
        "display_name":"ghvhgvhg",
        "model1":1
    },
    {
        "name":"abcde", 
        "display_name":"ghvhgvhg",
        "model1":1
    }
]

but when i print serializer.data after checking serializer.is_valid() it show model2:[] in serailizer.data.

Why my data is lost while performing validations on data?

1 Answer 1

0

This is because your Model3 can have only one instance of your Model2, is your Model2 that can be pointed by many instances of Model3

So your field model2 = Model2Serializer(many=True) is wrong, because a Model3 instance never may has "many instances of Model2"

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.