【问题标题】:django annotate queryset with field comparison resultdjango 用字段比较结果注释查询集
【发布时间】:2020-06-13 09:24:44
【问题描述】:

我有一个这样的查询集:

predicts = Prediction.objects.select_related('match').filter(match_id=pk)

我需要使用新字段 is_correct 对此进行注释。我需要比较两个字符串字段,结果应该在这个新字段中进行注释。我要比较的字段是:

  • predict 来自预测表
  • result 来自匹配表(已通过 select_related 加入)

我需要知道我应该在我的注释函数中放入什么表达式;下面我有我当前的代码,它通过 TypeError 异常:

predicts = predicts.annotate(is_correct=(F('predict') == F('result')))

所有帮助将不胜感激。

更新:

我找到了一个可以为我完成这项工作的替代解决方案(使用 filterexclude 根据匹配结果过滤预测),但我仍然想知道如何解决新注释字段所在的这种特定情况查询集的其他两个字段之间的比较结果。对于那些可能需要它的人,Django 2.2 和之后的Nullif database function 会在两个字段之间进行比较。

【问题讨论】:

    标签: django django-queryset query-expressions


    【解决方案1】:

    您可以使用extra 函数,这是一个将特定子句注入 SQL 的钩子。

    首先,我们必须知道应用程序和模型的名称,或者数据库中表的名称。

    假设在您的情况下,这两个表分别称为“app_prediction”和“app_match”。

    句子如下:

    Prediction.objects.select_related('match').extra(
        select={'is_correct': "app_prediction.predict = app_match.result"}
    )
    

    这将在结果中添加一个名为 is_correct 的字段, 在数据库中,字段和表的调用方式必须相同。

    最好看看模型。

    【讨论】:

    • 这会引发错误:[SQL Server]'=' 附近的语法不正确。 (102)
    • 试试单个“=”号,能不能也展示一下自己创建的模型?
    猜你喜欢
    • 2021-10-17
    • 2020-07-04
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2019-03-20
    • 2017-08-29
    相关资源
    最近更新 更多