带有字段比较结果的django注释查询集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有字段比较结果的django注释查询集相关的知识,希望对你有一定的参考价值。

我有这样的查询集:

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')))

所有帮助将不胜感激。

UPDATE:

[我找到了一个对我有用的替代解决方案(使用filterexclude根据匹配结果过滤预测),但是我仍然想知道如何解决这种特殊情况,即新的带注释字段是queryset的其他两个字段之间比较的结果。对于可能需要它的人,在Django 2.2和更高版本中,Nullif database function在两个字段之间进行比较。

答案

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

在您的情况下,将是这样:

predicts = predicts.extra(select={'is_correct': "predict = result"})

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

最好查看模型。

以上是关于带有字段比较结果的django注释查询集的主要内容,如果未能解决你的问题,请参考以下文章

如何在带注释的 Django 查询集结果上列出字段值?

Django - 查询:使用相关模型字段注释查询集

Django:通过注释字段的总和订购查询集?

Django 查询集优化 - 防止选择带注释的字段

Django 使用某些字段的最新值注释查询集

Django在查询集结果上添加附加字段[重复]