Как получить сумму значений из отношения ManyToMany в Django REST Framework - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать систему, в которой пользователь может сделать бронирование на рейс. У меня есть две модели с именами Item и Booking.

class Item(models.Model):
    item_name = models.CharField(max_length=100)
    item_price = models.DecimalField(max_digits=6, decimal_places=2)

    def __str__(self):
        return self.item_name


class Booking(models.Model):
    source = models.CharField(max_length=1000)
    date_booked = models.DateTimeField(auto_now_add=True)
    date_of_travel = models.DateTimeField()
    destination = models.CharField(max_length=1000)
    first_name = models.CharField(max_length=250)
    last_name = models.CharField(max_length=250)
    luggage_items = models.ManyToManyField(Item)

    def __str__(self):
        return f"{self.first_name} {self.source}-{self.destination}-{self.date_of_travel}"

. При создании бронирования пользователь может выбирать элементы модели Item, представленной в виде списка luggage_items. С каждым предметом связана цена. Я хотел бы иметь дополнительное поле в каждом экземпляре бронирования с именем total_price, которое является общей суммой для этого экземпляра всех элементов, которые пользователь выбирает при бронировании. Я также хотел бы, чтобы это обновлялось всякий раз, когда пользователь изменяет свое бронирование по запросу PUT. Я не знаю, как это реализовать. Я попытался добавить в модель Booking следующее:

    @property
    def total_price(self):
        queryset = self.luggage_items.through.objects.all().aggregate(
            total_price=models.Sum('item__item_price'))
        return queryset["total_price"]

Но это не работает, оно влияет на total_price для всех Booking экземпляров.

Вот мой serializers.py:

from rest_framework import serializers
from .models import Item, Booking


class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'item_name', 'item_price')


class BookingSerializer(serializers.ModelSerializer):

    class Meta:
        model = Booking
        fields = ('id', 'source', 'destination', 'date_of_travel',
                  'first_name', 'last_name', 'luggage_items')

и мой views.py

from django.shortcuts import render
from rest_framework import viewsets, permissions
from .models import Item, Booking
from .serializers import ItemSerializer, BookingSerializer

# Create your views here.


class ItemViewset(viewsets.ModelViewSet):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer


class BookingViewset(viewsets.ModelViewSet):
    queryset = Booking.objects.all()
    serializer_class = BookingSerializer

1 Ответ

1 голос
/ 04 февраля 2020

Просто поменяйте вашу собственность total_price вот так

@property
def total_price(self):
    queryset = self.luggage_items.all().aggregate(
        total_price=models.Sum('item__item_price'))
    return queryset["total_price"]
...