lord stock
lord stock

Reputation: 1201

Django Recursive Foreign Key for Serializer Getting not iterable errors

I followed a lot of answers regarding my questions, I tried all solutions given here

Basically scenario is almost same I wanted recursive query in my serializer. Firstly I want to show my models

class Policy(TimeStampedModel):
    product = models.ForeignKey(Product, related_name='policies', on_delete=models.PROTECT, null=True)
    name = models.CharField(max_length=32)
    slug = AutoSlugField(populate_from='name', editable=True, slugify_function=slugify)

and I have Foreign Key from Policy to PolicyCondition here is policy condition model.

class PolicyCondition(TimeStampedModel):
    policy = models.ForeignKey(Policy, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    slug = AutoSlugField(populate_from='name', editable=True, slugify_function=slugify,null=True)

    text = models.TextField()
    parent = models.ForeignKey(
        'self',
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name='children'
    )

On serializer I am fetching all my data from policy model. Here is my serializer.

class PolicyListSerializer(serializers.ModelSerializer):
    conditions = PolicyConditionSerializer(source='policycondition_set', many=True)



 class Meta:
        model = Policy
        fields = ['conditions']

Here is my policy condition serializer

class PolicyConditionSerializer(serializers.ModelSerializer):


    class Meta:
        model = PolicyCondition
        fields = [
            'id',
            'policy',
            'name',
            'text',
            'slug',
            'parent'
        ]

    def to_representation(self, instance):
        self.fields['parent'] = PolicyConditionSerializer(read_only=True)
        return super(PolicyConditionSerializer, self).to_representation(instance)

I am getting error as PolicyCondition' object is not iterable any soluton what I am missing here.

Upvotes: 1

Views: 146

Answers (1)

Mukhtor Rasulov
Mukhtor Rasulov

Reputation: 587

Change serializer class like this:

class PolicyConditionSerializer(serializers.ModelSerializer):
    parent = PolicyConditionSerializer(read_only=True)
    class Meta:
        model = PolicyCondition
        fields = [
            'id',
            'policy',
            'name',
            'text',
            'slug',
            'parent'
        ]

or edit to_representation:

def to_representation(self, instance):
    data = super(PolicyConditionSerializer, self).to_representation(instance)
    data['parent'] = PolicyConditionSerializer(read_only=True).data
    return data

Upvotes: 1

Related Questions