OneToOneField related_query_name

时间:2018-08-02 07:35:09

标签: django orm

我有2个模型,另一个是OneToOneField 让我叫CaseIssueClosedCaseIssue模型

class CaseIssue(...):
   pass

class ClosedCaseIssue(...):
   case_issue = models.OneToOneField(CaseIssue, related_name='closed_case_issue', related_query_name='closed_case_issue', on_delete=models.CASCADE)

通过使用related_query_name,我可以搜索仍处于打开状态的CaseIssue。已创建由ClosedCaseIssue确定的打开或关闭,并与CaseIssue

相关

这是正确的数字CaseIssue.objects.filter(closed_case_issue=None).count()

这是我获取Open CaseIssue的方法。但是结果是1这是错误的 CaseIssue.objects.filter(closed_case_issue=not None).count()

问题:
获得Open CaseIssue的实际方法是什么?

1 个答案:

答案 0 :(得分:2)

您不能写not None,因为not None的结果就是True。实际上not检查表达式的真实性,并将其还原。所以:

>>> not None
True

因此,您永远不会将not None本身传递给Django ORM,仅将True传递给Django ORM,这意味着您实际上要检查.filter(closed_case_issue=True),因此我们不能将closed_case_issue限制为True(或1),通常返回最多1个元素。

但是您可以使用isnull [Django-doc]查找来对数据库进行检查,以检查它是否不是None

CaseIssue.objects.filter(closed_case_issue__isnull=False).count()

或者如果您要计算有CaseIssue的{​​{1}}的数量,则可以使用:

ClosedCaseIssue

这等效于您实现的CaseIssue.objects.filter(closed_case_issue__isnull=True).count()过滤器。

您还可以使用它进行过滤,从而检索closed_case_issue=None,例如:

CaseIssue