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=Noneparent__isnull=Trueparent_id__isnull=True

結合を作成せずにクエリを実行するにはどうすればよいですか?

4

1 に答える 1

1

Django フィルターで null 許容フィールドが null であることを要求する適切な方法は、__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 に答える