我有两个模型
class MenuItem(models.Model):
title = models.CharField(max_length=255, db_index=True)
price = models.DecimalField(max_digits=6, decimal_places=2, db_index=True)
featured = models.BooleanField(db_index=True)
category = models.ForeignKey(Category, on_delete=models.PROTECT)
def __str__(self):
return f'{self.title}'
class Cart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
menuitem = models.ForeignKey(MenuItem, on_delete=models.CASCADE)
quantity = models.SmallIntegerField()
unit_price = models.DecimalField(max_digits=6, decimal_places=2, default=0)
price = models.DecimalField(max_digits=6, decimal_places=2, default=0)
class Meta:
unique_together = ('menuitem', 'user')
对于特定对象,MenuItem.price应该等于Cart.unit_price。现在我遇到的问题是为Cart模型编写序列化程序。
到目前为止,我已经尝试了这个:
class MenuItemSerializer(serializers.HyperlinkedModelSerializer):
title = serializers.CharField(max_length=255)
price = serializers.DecimalField(max_digits=6, decimal_places=2)
category_id = serializers.IntegerField(write_only=True)
category = CategorySerializer(read_only=True)
featured = serializers.BooleanField()
class Meta:
model = MenuItem
fields = ['title', 'price', 'category', 'category_id', 'featured']
depth = 1
class CartSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(
default=serializers.CurrentUserDefault(),
)
menu_item = MenuItemSerializer
quantity = serializers.IntegerField()
# unit_price = serializers.DecimalField(max_digits=6, decimal_places=2, style={'input_type':'hidden'})
unit_price = serializers.ReadOnlyField(source="menuitem.price", read_only=True)
price = SerializerMethodField()
class Meta:
model = Cart
fields = ['user', 'menuitem', 'unit_price', 'quantity', 'price']
def get_price(self, obj):
return obj.quantity * obj.unit_price
然后相关视图
class Cart(mixins.ListModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Cart.objects.all()
serializer_class = CartSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
但是,这不会返回所需的价格值。它只返回0。
我是一个django新手,这让我抓狂。如果有人能帮忙就好了。
这是我得到的一个示例响应:{“menuitem”:1,“unit_price”:2.5、“数量”:3、“价格”:0 }
1条答案
按热度按时间hof1towb1#
您将
price
和unit_price
与MenuItem
模型沿着存储在Cart
模型中。在
CartSerializer
中,在get_price
方法中,您使用Cart
的unit_price
而不是MenuItem
来计算最终价格,而CartSerializer
的unit_price
字段具有source="menuitem.price"
。因此,在您共享的响应中,您从菜单项模型中获取
"unit_price": 2.5
,而您的价格是通过使用Cart
模型的unit_price
字段计算的,该字段必须为0,因为它默认为0。因此,您的最终价格结果为3(数量)* 0(来自购物车模型的价格)= 0,而它应该是3(数量)* 2.5(来自菜单项模型的价格)= 7.5。确保从
Cart
模型中删除冗余字段,以减少混淆,并将CartSerializer中的get_price
方法更新为: