如何从 Django REST Framework 中的 ManyToMany 关系中获取值的总和
How to get sum of values from a ManyToMany relation in Django REST Framework
我正在尝试创建一个用户可以预订航班的系统。我有两个名为 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"]
但这不起作用,它会影响 所有 Booking
个实例的 total_price
。
这是我的 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
只需像这样更改您的 属性 total_price
@property
def total_price(self):
queryset = self.luggage_items.all().aggregate(
total_price=models.Sum('item_price'))
return queryset["total_price"]
我正在尝试创建一个用户可以预订航班的系统。我有两个名为 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"]
但这不起作用,它会影响 所有 Booking
个实例的 total_price
。
这是我的 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
只需像这样更改您的 属性 total_price
@property
def total_price(self):
queryset = self.luggage_items.all().aggregate(
total_price=models.Sum('item_price'))
return queryset["total_price"]