Original exception text was: 'RelatedManager' object has no attribute 'type'. – Django Rest

Question:

models.py

class Sequence(models.Model):
    category_id = models.ForeignKey(SequenceCategory, on_delete=models.CASCADE)
    description = models.TextField()
    code = models.CharField(max_length=50)
    total_divisions = models.IntegerField()
    status = models.BooleanField(default=True)

    def __str__(self):
        return self.code


class SequenceValue(models.Model):
    TYPE_CHOICES =(
        ('N', 'Numeric'),
        ('A', 'Alphabet')
    )
    sequence_id = models.ForeignKey(Sequence, on_delete=models.CASCADE, blank=True, null=True, related_name='Sequence_details')
    type = models.CharField(max_length=100, choices=TYPE_CHOICES)
    value = models.CharField(max_length=50)
    starting_value = models.CharField(max_length=50, null=True, blank=True)
    increment_value = models.CharField(max_length=50, null=True, blank=True)

    def __str__(self):
        return self.value

serializers.py

class SequenceValueSerializer(serializers.ModelSerializer):
    class Meta:
        model = SequenceValue
        # fields = '__all__'
        exclude = ['sequence_id']


class SequenceSerializer(serializers.ModelSerializer):
    Sequence_details = SequenceValueSerializer()

    class Meta:
        model = Sequence
        fields = '__all__'

    def create(self, validate_data):
        Sequence_details_data = validate_data.pop('Sequence_details')
        sequence_id = Sequence.objects.create(**validate_data)
        SequenceValue.objects.create(sequence_id=sequence_id, **Sequence_details_data)
        return sequence_id

views.py

class SequenceCreate(ListCreateAPIView):
    queryset = Sequence.objects.all()
    serializer_class = SequenceSerializer

Why do I get the error? When I refer to n number of articles I got a solution that put many=True something like this.

Sequence_details = SequenceValueSerializer(many=True)

But when I make changes on that then I can’t get the Sequence details fields. How can I fix this issue? Can you give a solution, please?

Actual error-

Got AttributeError when attempting to get a value for field type on serializer SequenceValueSerializer.
The serializer field might be named incorrectly and not match any attribute or key on the RelatedManager instance.
Original exception text was: ‘RelatedManager’ object has no attribute ‘type’.

Data Passess

Data - {
    "Sequence_details": [{
        "type": "N",
        "value": "123",
        "starting_value": "1",
        "increment_value": "1"
    }],
    "description": "asd",
    "code": "qwe",
    "total_divisions": 2,
    "status": false,
    "category_id": 3
}

Actual eroor screenshot

Actual eroor screenshot

Asked By: Sarath Chandran

||

Answers:

I can’t comment so I will just mention it here :). type is actually a function in python which tells you about the class type of argument. I am not sure if this the issue but the can you try by renaming type to _type or something of your choice.

Answered By: Nishad Wadwekar

Adding many=True works because your request data passes Sequence_details as a list. In order to use it in your serializer, you can just iterate through the field and create your objects like this:

class SequenceSerializer(serializers.ModelSerializer):
    Sequence_details = SequenceValueSerializer(many=True)

    class Meta:
        model = Sequence
        fields = '__all__'

    def create(self, validate_data):
        Sequence_details_data = validate_data.pop('Sequence_details')
        sequence_id = Sequence.objects.create(**validate_data)

        for details in Sequence_details_data
            SequenceValue.objects.create(sequence_id=sequence_id, **details)
        return sequence_id

But if you don’t want to do this, you can remove many=True and keep your serializer as is, but ensure that Sequence_details in your request data is not a list:

{
    "Sequence_details": {
        "type": "N",
        "value": "123",
        "starting_value": "1",
        "increment_value": "1"
    },
    "description": "asd",
    "code": "qwe",
    "total_divisions": 2,
    "status": false,
    "category_id": 3
}
Answered By: Brian Destura