ankush981
ankush981

Reputation: 5417

Field not found on serializer

I'm building a REST API using DRF, and am currently stuck with modeling the endpoint /api/v1/venues/1/packages/. A GET request on this is giving me this error:

AttributeError at /api/v1/venues/1/packages/

Got AttributeError when attempting to get a value for field item_type on serializer MenuItemSerializer.

The serializer field might be named incorrectly and not match any attribute or key on the ManyRelatedManager instance.

Original exception text was: 'ManyRelatedManager' object has no attribute 'item_type'.

Here are the participating models:

class MenuItemType(models.Model):
    class Meta:
        db_table = 'menu_item_types'
    
    name = models.TextField()

class MenuItem(models.Model):
    class Meta:
        db_table = 'menu_items'
    
    name = models.TextField()
    item_type = models.ForeignKey('MenuItemType', on_delete=models.CASCADE)

class PackageItems(models.Model):
    class Meta:
        db_table = 'package_items'
    
    package = models.ForeignKey('Package', on_delete=models.CASCADE)
    menu_item = models.ForeignKey('MenuItem', on_delete=models.CASCADE)
    quantity = models.DecimalField(max_digits=10, decimal_places=2)
    comments = models.TextField(null=True)

class Package(models.Model):
    class Meta:
        db_table = 'packages'
    
    name = models.TextField()
    price = models.DecimalField(max_digits=16, decimal_places=2)
    comments = models.TextField(null=True)

    venue = models.ForeignKey('Venue', on_delete=models.CASCADE)
    menu_items = models.ManyToManyField('MenuItem', through='PackageItems')

and the serializers:

class MenuItemTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = MenuItemType
        fields = ['id', 'name']

class MenuItemSerializer(serializers.ModelSerializer):
    item_type = MenuItemTypeSerializer()
    class Meta:
        model = MenuItem
        fields = ['id', 'name', 'item_type']

class PackageItemSerializer(serializers.ModelSerializer):
    menu_items = MenuItemSerializer()
    class Meta:
        model = PackageItems
        fields = ['id', 'menu_items', 'quantity', 'comments']

class PackageSerializer(serializers.ModelSerializer):
    menu_items = MenuItemSerializer()
    class Meta:
        model = Package
        fields = ['id', 'venue_id', 'name', 'price', 'comments', 'menu_items']

Let me admit up-front that I'm new Django and DRF and might be making some stupid mistake. Criticism, therefore, is most welcome!

Upvotes: 1

Views: 1116

Answers (1)

Ivan Semochkin
Ivan Semochkin

Reputation: 8907

Your need to set many=True in a MenuItemSerializer when you call it from related manager

class PackageSerializer(serializers.ModelSerializer):
    menu_items = MenuItemSerializer(many=True)

    class Meta:
        model = Package
        fields = ['id', 'venue_id', 'name', 'price', 'comments', 'menu_items']

Upvotes: 1

Related Questions