如何在Django Rest框架上显示ManytoMany模型关系变量的值

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

我是django的新手,正在苦苦挣扎,我看过google,但找不到任何可以帮助的东西。

这是我的模特:

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',]

[当我评论餐= MealSerializer(read_only = True,many = True)行时,它将输入显示为table_id和餐,其中餐值分别为餐对象(1),平均对象(2)...。

我的问题:

  1. 如何显示膳食对象值而不是它作为对象。
  2. 如何在视图/序列化器中使用total_price方法。
  3. 如何看待流,如流从哪个类流向哪个类调用以及我收到的结构的类型和值是什么。

谢谢。

python-3.x django-models django-rest-framework django-serializer django-related-manager
1个回答
0
投票
  1. 如何显示膳食对象值而不是它作为对象。

在用餐时使用__str__方法。

  1. 如何在视图/序列化器中使用total_price方法。

在视图的查询集中定义注释,然后将自定义字段添加到序列化程序。除非它是一次性的,否则请勿将其添加到模型中。您拥有的方式效率很低,因为它将为列表视图生成许多查询。

  1. 如何看待流,如流从哪个类流向哪个类调用以及我收到的结构的类型和值是什么。

在像PyCharm,PDB或经典的print语句之类的IDE中使用调试器。

下面是我对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')
    )
© www.soinside.com 2019 - 2024. All rights reserved.