【问题标题】:Django compare query with F objects adds extra not null checkDjango 将查询与 F 对象进行比较添加了额外的非空检查
【发布时间】:2016-11-09 18:01:14
【问题描述】:

我正在尝试使用 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。这会影响我的结果,因为电子邮件字段中可能存在空值。

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

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-10
      • 2023-03-26
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多