首页 > 解决方案 > django 用字段比较结果注释查询集

问题描述

我有一个这样的查询集:

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

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

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

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

所有帮助将不胜感激。

更新:

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

标签: djangodjango-querysetquery-expressions

解决方案


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

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

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

句子如下:

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

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

最好看看模型。


推荐阅读