为什么多对多字段关系菜单没有显示正确的字段?

问题描述 投票:0回答:1

最近我正在将我的项目转换为DRF,并且serializer.py如下:

from rest_framework import serializers
from .models import Menu,MenuCategory,MenuItem

class MenuItemSerializer(serializers.ModelSerializer):

    class Meta:
        model = Menu
        fields = ['name', 'additional_text', 'order']


class MenuCategorySerializer(serializers.ModelSerializer):
    menuitem = serializers.StringRelatedField(many=True, read_only=True)

    class Meta:
        model = MenuCategory
        fields = ['order', 'name', 'description','menuitem']

        def create(self, MenuCategory, MenuItem,validated_data):
            menucategory=MenuCategory.objects.create(**validated_data)
            item_data = validated_data.pop('menuitem')
            for it_data in item_data:
                MenuItem.objects.create(menucategory=menucategory, **item_data)
            return menucategory


class MenuSerializer(serializers.ModelSerializer):
    menucategory = serializers.StringRelatedField(many=True, read_only=True)

    class Meta:
        model = Menu
        fields = ['name', 'additional_text', 'order','menucategory']

        def create(self,MenuCategory, Menu, validated_data):
            category_data = validated_data.pop('menucategory')
            menu= Menu.objects.create(**validated_data)
            for cat_data in category_data:
                    MenuCategory.objects.create(menu=menu, **category_data)   
            return menu

当我浏览http://localhost:8000/api/时显示:

[
    {
        "name": "Breakfast",
        "additional_text": "Served between 8:00am and11:00am",
        "order": 1,
        "menucategory": [
            "MenuCategory object (3)",
            "MenuCategory object (4)"
        ]
    },
    {
        "name": "Lunch",
        "additional_text": "Served between  12:00pm and 3:00pm",
        "order": 2,
        "menucategory": [
            "MenuCategory object (1)",
            "MenuCategory object (5)",
            "MenuCategory object (7)"
        ]
    },
    {
        "name": "Dinner",
        "additional_text": "Served between  6:00pm and 10:00pm",
        "order": 3,
        "menucategory": [
            "MenuCategory object (2)",
            "MenuCategory object (6)",
            "MenuCategory object (8)"
        ]
    },
    {
        "name": "Drinks",
        "additional_text": "Happy hour 3:00pm to 6:00 pm",
        "order": 4,
        "menucategory": [
            "MenuCategory object (9)",
            "MenuCategory object (10)",
            "MenuCategory object (11)"
        ]
    }
]

但是列表不应该显示菜单对象这类的东西。它应该显示带有价格和其他字段的商品和类别名称。这是我的views.py:

from rest_framework import generics
from .models import Menu,MenuCategory,MenuItem
from .serializers import MenuCategorySerializer,MenuSerializer,MenuItemSerializer
class ListMenuCategory(generics.ListAPIView):
    queryset = MenuCategory.objects.order_by('order')
    serializer_class = MenuCategorySerializer
class ListMenu(generics.ListAPIView):
    queryset = Menu.objects.order_by('order')
    serializer_class = MenuSerializer
class ListMenuItem(generics.ListAPIView):
    queryset = MenuItem.objects.order_by('order')
    serializer_class = MenuItemSerializer

和我的models.py,如下所示:

   from django.db import models

    class MenuItem(models.Model):

        menu_category = models.ManyToManyField('MenuCategory', related_name='menuitem',help_text='The menus that this category belongs to, i.e. \'Lunch\'.') 
        name = models.CharField(max_length=48, help_text='Name of the item on the menu.')
        description = models.CharField(max_length=128, null=True, blank=True, help_text='The description is a simple text description of the menu item.')
        order = models.IntegerField(default=0, verbose_name='order', help_text='The order is to specify the order in which items show up on the menu.')
        price = models.FloatField(help_text='The price is the cost of the item.')


        class Meta:
            ordering = ['order', 'name']

        def __unicode__(self):
            return self.name


    class MenuCategory(models.Model):
        menu = models.ManyToManyField('Menu', related_name='menucategory',help_text='The menus that this category belongs to, i.e. \'Lunch\'.') 
        name = models.CharField(max_length=48, help_text='Name of the item on the menu.')
        description = models.CharField(max_length=128, null=True, blank=True, help_text='The description is a simple text description of the menu item.')
        order = models.IntegerField(default=0, verbose_name='order', help_text='The order is to specify the order in which items show up on the menu.')

        class Meta:
            ordering = ['order', 'name']

        def __unicode__(self):
            return self.name



    class Menu(models.Model):
        name = models.CharField(max_length=32, verbose_name='menu category name')
        additional_text = models.CharField(max_length=128, null=True, blank=True, help_text='The additional text is any bit of related information to go along with a menu category, i.e. the \'Pasta\' category might have details that say \'All entrees come with salad and bread\'.')
        order = models.IntegerField(default=0, help_text='The order is the order that this category should appear in when rendered on the templates.')

        class Meta:
            ordering = ['order', 'name']

        def __unicode__(self):
            return self.name

我应该如何查询以及如何修复我的DRF api列表?

django django-models django-rest-framework django-views django-serializer
1个回答
0
投票
[You should use the serializer for the related model,如果您想使用相关的串行器,而不是serializers.StringRelatedField

class MenuSerializer(serializers.ModelSerializer): menucategory = MenuCategorySerializer(many=True, read_only=True)

© www.soinside.com 2019 - 2024. All rights reserved.