0

我有以下模型(部分)模型定义:

class Album(models.Model):
  name          = models.CharField(max_length=50, 
                                 null=False, 
                                 blank=True)
  parent        = models.ForeignKey("self",
                                  null = True,
                                  default = None,
                                  blank = True,
                                  help_text="Points to a parent album",
                                  related_name="children")

当我运行manage.py debugsqlquery并检查生成的查询时,我得到了一个不应该存在的连接:

>>> a_qs = Album.objects.filter(parent=None)
>>> for a in a_qs:
...  print a
... 

结果查询是:

SELECT "photos_album"."id",
   "photos_album"."name",
   "photos_album"."parent_id",
   "photos_album"."owner_id",
   "photos_album"."order",
   "photos_album"."system",
   "photos_album"."created",
   "photos_album"."last_modified"
FROM "photos_album"
LEFT OUTER JOIN "photos_album" T2 ON ("photos_album"."parent_id" = T2."id")
WHERE T2."id" IS NULL
ORDER BY "photos_album"."order" ASC, "photos_album"."name" ASC  [0.42ms]

我试图摆脱LEFT OUTER JOIN我尝试过parent_id=None的 ,parent__isnull=Trueparent_id__isnull=True所有生成连接。

如何在不创建联接的情况下执行查询?

4

1 回答 1

1

在 Django 过滤器中要求可空字段为空的正确方法是使用__isnull参数,而不是相等:

a_qs = Album.objects.filter(parent__isnull=True)

但我看到你已经尝试过了。事实证明,这是 Django 中的一个已知错误,已在当前开发版本中更正,但在 1.5 或更高版本中没有:

https://code.djangoproject.com/ticket/10790

您可以使用extra子句解决查询中的错误:

a_qs = Album.objects.extra(where=["parent_id is null"])
于 2013-11-04T21:38:53.490 回答