Django比较查询与F对象添加额外的非空检查

时间:2016-07-07 12:09:38

标签: django django-models django-queryset

我正在尝试使用F对象查询Django模型,但没有获得所需的结果。 查询是:

Ticket.objects.exclude(lead__email=F('email')).count()

ORM将其翻译成SQL:

SELECT count(*) FROM "core_ticket" LEFT OUTER JOIN "core_lead" ON ("core_ticket"."lead_id" = "core_lead"."id") WHERE NOT ("core_lead"."email" = ("core_ticket"."email") AND "core_lead"."email" IS NOT NULL)

我的问题是ORM在where子句中添加了这个AND "core_lead"."email" IS NOT NULL。这会影响我的结果,因为电子邮件字段中可以有空值。

有没有办法避免这种额外的非空检查。

1 个答案:

答案 0 :(得分:0)

我认为您的电子邮件模型定义中必须有null=True。因此,解决此问题的最简单方法是删除null=True,迁移然后重试。因此,如果电子邮件为“无”,则为''而不是None,则F()将起作用。

另一种方法是使用Q()查询,但它会花费在Python内存中。