Mohit Harshan
Mohit Harshan

Reputation: 1986

Django rest nested serializer not displaying fields

I have a model Workflow and WorkflowLevel. Each workflow has many WOrkflow levels .Im trying to use nested serializer :

class WorkflowLevelSerializer
(serializers.ModelSerializer):
class Meta:
    model = WorkflowLevel
    fields = '__all__'


class 
WorkflowSerializer
(serializers.ModelSerializer):

levels = WorkflowLevelSerializer(many=True)

class Meta:
    model = Workflow
    fields = ('id', 'name', 'description', 
'tenant', 'levels')

models.py:

class Workflow(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=32, default=None, null=True)
description = models.CharField(max_length=100, default=None, null=True)
tenant = models.ForeignKey(Tenant, on_delete=models.CASCADE, default=None, 
null=False)
class Meta:
    unique_together = ('name', 'tenant',)


class WorkflowLevel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, 
default=None, null=False)
level = models.IntegerField(default=None, null=False)
operation = models.CharField(max_length=32, default=None, null=False)
class Meta:
    unique_together = ('workflow', 'level',)

The levels field is not displaying in the workflow listAPI view . Getting error:

Got AttributeError when attempting to get a value 
for field `levels` on serializer 
`WorkflowSerializer`.
The serializer field might be named incorrectly 
and not match any attribute or key on the 
`Workflow` instance.
Original exception text was: 'Workflow' object 
has no attribute 'levels'.

Upvotes: 0

Views: 79

Answers (1)

ruddra
ruddra

Reputation: 51948

You can define related_name in the Model like this:

 workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, related_name="levels", default=None, null=False)

I am using related_name='levels', so that in Serializer, it will use that reverse relationship name to fetch WorkflowLevel data from db.

Upvotes: 1

Related Questions