Django REST框架发布数据未正确序列化

bpsygsoo  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(203)

我有两个模型

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 }

hof1towb

hof1towb1#

您将priceunit_priceMenuItem模型沿着存储在Cart模型中。
CartSerializer中,在get_price方法中,您使用Cartunit_price而不是MenuItem来计算最终价格,而CartSerializerunit_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方法更新为:

def get_price(self, obj):
    return obj.quantity * obj.menuitem.price

相关问题