【发布时间】:2021-05-07 18:26:59
【问题描述】:
这是我的models.py:
class Category(models.Model):
category_des = models.CharField(max_length=250)
class Type(models.Model):
type_des = models.CharField(max_length=250)
class Product(models.Model):
category_id = models.ForeignKey(Category, on_delete=models.CASCADE)
type_id = models.ForeignKey(Type, on_delete=models.CASCADE)
product_name = models.CharField(max_length=250)
product_price = models.FloatField()
我想要做的是将产品分为菜单列表和附加列表,并按类别对它们进行分组,如下所示:
第 1 类:
额外的 1.a
额外的 1.b
菜单 1.c
菜单 1.d
第 2 类:
额外的 2.e
额外的 2.f
菜单 2.g
菜单 2.h
这就是我在views.py中所做的:
class MenuList(generics.ListCreateAPIView):
queryset = models.Product.objects.filter(type_id=1).annotate("category_id")
serializer_class = serializers.ProductSerializer
class MenuDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Product.objects.filter(type_id=1).annotate("category_id")
serializer_class = serializers.ProductSerializer
class ExtraList(generics.ListCreateAPIView):
queryset = models.Product.objects.filter(type_id=2).annotate("category_id")
serializer_class = serializers.ProductSerializer
class ExtraDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Product.objects.filter(type_id=2).annotate("category_id")
serializer_class = serializers.ProductSerializer
我收到此错误:TypeError: QuerySet.annotate() received non-expression(s): category_id.
【问题讨论】:
-
我不明白你为什么要使用注释,你的产品模型有一个类别的外键,所以类别 id 已经包含了。
-
@Guillaume 我只想按类别 ID 对我的产品(菜单和附加功能)进行分组
-
您确定不是要按类别 id 订购吗?仅当您计划(例如)对特定字段求和时,分组依据才有用。
-
解释消息:您正在注释一个固定的字符串(并且您还依赖 Django 为注释命名)。错误消息告诉您纯字符串不是可以用作注释的事物类型。你需要使用
Value("my string")来改变它。