首页 > 解决方案 > Django通过外键注释

问题描述

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

标签: djangodjango-annotate

解决方案


查询表达式和 F() 对象

Django 3.2 文档

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

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


推荐阅读