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

编辑: 我打算制作此注释的原因是为了更轻松地过滤变量,您可以在接下来的两个执行函数中看到。

这两种方法将在更大的查询链中使用,因此(具有讽刺意味的是)通过注释保持简单应该会有所帮助。

【问题讨论】:

看到&amp; 位运算符引起了一些注意,and 是 Python 中的逻辑运算符 这是文档中推荐的添加这些对象的方式,check it out。但你可能正在做某事 我不确定在 annotate 子句中使用 Q 对象会发生什么;这不是他们的目的。您希望得到什么结果? 我已经将我想要这个的原因附加到 Q。但我的目的是最终在我的每个 上都有一个可过滤的字段。 【参考方案1】:

正如我在 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

JSONKit 无法从 php 解析简单的 JSON?

Xcode Audiocomponent Symbols not found 并且不知何故无法使用方法

Pandas,条形图注释

jQuery mouseout 停止播放?

内网一台Linux服务器一设网关即出现网络连接延迟,相同环境的Windows机器没有问题,不知何故?