Python 3.x 如何在Django Rest框架上显示多模型关系变量的值

Python 3.x 如何在Django Rest框架上显示多模型关系变量的值,python-3.x,django-models,django-rest-framework,django-serializer,django-related-manager,Python 3.x,Django Models,Django Rest Framework,Django Serializer,Django Related Manager,我是django的新手,正在苦苦挣扎,我浏览了谷歌,但找不到任何有帮助的东西 这是我的模型: from django.db import models # from django.contrib.auth.models import class Order(models.Model): table_id = models.IntegerField(unique=True) meal = models.ManyToManyField('meals') # Meal

我是django的新手,正在苦苦挣扎,我浏览了谷歌,但找不到任何有帮助的东西

这是我的模型:

from django.db import models
# from django.contrib.auth.models import


class Order(models.Model):

    table_id = models.IntegerField(unique=True)
    meal = models.ManyToManyField('meals')

    # Meal = models.ForeignKey('Meals',on_delete=models.CASCADE)
    @property
    def total_price(self):
        price = self.meal.objects.all().aggregate(total_price=models.Sum('meals__price'))
        return price['total_price']

class Meals(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(decimal_places=2, max_digits=5)
这是我的serializer.py:

from rest_framework import serializers


from cafe_app import models
class MealSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Meals
        fields = ['id','name','price',]

class OrderSerializer(serializers.ModelSerializer):

    **meal = MealSerializer(read_only=True,many=True)**
    class Meta:
        model = models.Order
        fields = ['table_id','meal',]
当我注释Mean=MealSerializer(只读=True,多个=True)行时,它将输入显示为表格id和Mean,其中Mean值为Mean对象(1),Mean对象(2)

我的问题是:

  • 如何显示膳食对象值,而不是将其显示为对象
  • 如何在视图/序列化程序中使用total_price方法
  • 如何查看流,比如它如何从哪个类流向哪个类调用,以及我收到的结构的类型和值是什么
  • 谢谢

  • 如何显示膳食对象值,而不是将其显示为对象
  • 在进餐时使用
    \uuu str\uu
    方法

  • 如何在视图/序列化程序中使用total_price方法
  • 在视图的查询集中定义注释,然后将自定义字段添加到序列化程序中。除非是一次性的,否则不要将其添加到模型中。这种方式效率很低,因为它会为列表视图生成许多查询

  • 如何查看流,比如它如何从哪个类流向哪个类调用,以及我收到的结构的类型和值是什么
  • 在IDE中使用调试器,如PyCharm,或经典的
    print
    语句

    下面是我为1和2建议的更正

    # models.py
    from django.db import models
    
    class Order(models.Model):
    
        table_id = models.IntegerField(unique=True)
        meal = models.ManyToManyField('meals')
    
    
    class Meals(models.Model):
        name = models.CharField(max_length=100)
        price = models.DecimalField(decimal_places=2, max_digits=5)
    
        def __str__(self):
            # This method defines what the string representation an instance.
            return f'{self.name}: ${self.price}'
    
    
    # serializers.py
    from rest_framework import serializers
    
    
    from cafe_app import models
    class MealSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = models.Meals
            fields = ['id','name','price',]
    
    
    class OrderSerializer(serializers.ModelSerializer):
        total_price = serializers.FloatField(read_only=True)
        meal = MealSerializer(read_only=True,many=True)
        class Meta:
            model = models.Order
            fields = ['table_id','meal', 'total_price']
    
    
    # views.py
    class OrderView(ViewSet): # or View.
    
        queryset = Order.objects.annotate(
            total_price=Sum('meal__price')
        )
    

    嗨,pkd我知道这让你很困惑。对大多数人来说都是这样。但是如果你练习并阅读文档和教程,它会变得更容易。对于第2点,检查序列化程序方法字段。对于3,在pycharm中使用调试器。我不能理解第一点。