Django通过外键注释

时间:2021-05-07 18:26:59

标签: django django-annotate

这是我的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.

1 个答案:

答案 0 :(得分:0)

查询表达式和 F() 对象

Django 3.2 Documentation

class MenuList(generics.ListCreateAPIView):
    queryset = models.Product.objects.filter(type_id=1).annotate(F("category_id"))
    serializer_class = serializers.ProductSerializer

尝试使用 F() 对象将 category_id 添加到查询集中的每个对象。