Django不知何故无法确定简单的注释功能
Posted
技术标签:
【中文标题】Django不知何故无法确定简单的注释功能【英文标题】:Django somehow cannot determine simple annotate function 【发布时间】:2018-07-07 09:46:33 【问题描述】:我正在尝试在查询集类上创建一个注释,它只是添加一个布尔值,该布尔值是一些标准查询的结果。
CustomQueryset(models.QuerySet):
""" An extension of the traditional queryset to support
filtering on accepting_offers """
def annotate_with_accepting_offers(self):
""" Add a lovely little variable to the SELECT that
says if the listing is accepting offers.
A <thing> is accepting offers when its:
+ not cancelled
+ expire date is today or in the future
+ has spaces left
"""
return self.annotate(accepting_offers=Q(cancelled=False) & Q(expire_date__gte=date.today()) & Q(spaces_left__gt=0))
def accepting_offers(self):
""" Annotate with 'accepting_offers' and filter the results that are True """
return self.annotate_with_accepting_offers().filter(accepting_offers=True)
def not_accepting_offers(self):
""" Annotate with 'accepting_offers' and filter the results that are False """
return self.annotate_with_accepting_offers().filter(accepting_offers=False)
不幸的是,这不起作用,有什么想法可以注释吗?
如果这是 SQL,第一行将如下所示:
SELECT *, (cancelled=False AND expire_date >= ? AND spaces_left > 0) AS accepting_offers
编辑: 我打算制作此注释的原因是为了更轻松地过滤变量,您可以在接下来的两个执行函数中看到。
这两种方法将在更大的查询链中使用,因此(具有讽刺意味的是)通过注释保持简单应该会有所帮助。
【问题讨论】:
看到&
位运算符引起了一些注意,and
是 Python 中的逻辑运算符
这是文档中推荐的添加这些对象的方式,check it out。但你可能正在做某事
我不确定在 annotate 子句中使用 Q 对象会发生什么;这不是他们的目的。您希望得到什么结果?
我已经将我想要这个的原因附加到 Q。但我的目的是最终在我的每个 正如我在 cmets 中提到的,这根本不是 Q 表达式的用途。我想你想要的是conditional expression:
return self.annotate(
accepting_offers=Case(
When(cancelled=False, expire_date__gte=date.today(), spaces_left__gt=0, then=Value(True)),
default_value=Value(False),
output_field=models.BooleanField()
)
)
【讨论】:
太棒了,我现在就试一试 啊,不,我收到以下错误:FieldError: Cannot resolve expression type, unknown output_field
。有什么想法吗?
啊哈!想通了,我们需要说出它将输出到的类型。 (更新答案)
您能否更新您的答案以包含 Case 参数:output_field=models.BooleanField()
,然后我会接受您的回答。 (我的编辑被拒绝了)
感谢您的编辑,如果没有它,我会在几个月后遇到同样的问题。以上是关于Django不知何故无法确定简单的注释功能的主要内容,如果未能解决你的问题,请参考以下文章
MS Access VBA - 不知何故没有通过 OpenArgs,总是 NULL