【问题标题】:Django annotate by foreign keyDjango通过外键注释
【发布时间】: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") 来改变它。

标签: django django-annotate


【解决方案1】:

查询表达式和 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 添加到查询集中的每个对象。

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 2019-01-22
    • 1970-01-01
    • 2019-02-28
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多