Как отобразить значение переменной отношения модели ManytoMany на Django Rest Framework - PullRequest
1 голос
/ 06 марта 2020

Я новичок в 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)

Вот my 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 на мой взгляд / serializer.
  3. Как увидеть поток, например, как он течет из какого класса в какой класс идет вызов и каков тип и значение структуры, которую я получил.

Спасибо.

1 Ответ

1 голос
/ 06 марта 2020
  1. Как отобразить значение еды вместо объекта в качестве объекта.

Использовать метод __str__ для еды.

Как использовать метод total_price в моем представлении / сериализаторе.

Определите аннотацию в наборе запросов вашего представления, затем добавьте настраиваемое поле в сериализатор. Не добавляйте его в свою модель, если это не одноразовая вещь. То, как вы это делаете, довольно неэффективно, поскольку генерирует много запросов для представления списка.

Как увидеть поток, например, как он течет из какого класса в какой класс идет вызов, и каков тип и значение структуры, которую я получил.

Использование отладчика в IDE как PyCharm, PDB или операторы classi c 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')
    )
...