2013-11-04 29 views
0

我有如下模型(部分)模型定義:如何保持的Django從創建加入對父=無

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和所有生成連接。

如何在不創建連接的情況下執行查詢?

+1

不是一個真正的答案。當它是問題的正確答案時,我使用MPTT。這不是一個通用的樹問題。這是django在創建'JOIN'時不需要的特殊問題。整個'LEFT OUTER JOIN ... WHERE T2。「id」IS NULL'應該簡化爲WHERE「photos_album」。「parent_id」IS NULL' – ctjctj2

回答

1

需要在Django篩選可爲空字段爲空的正確方法是使用__isnull說法,不是平等:

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

但我看到你已經試過了。事實證明,這是Django的一個已知的bug,在目前的開發版本更正,但沒有在1.5或更早:

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

你可以解決的錯誤在查詢中使用的extra條款:

a_qs = Album.objects.extra(where=["parent_id is null"]) 
+0

謝謝Peter DeGlooper,不幸的是,它仍然生成JOIN,我試過了'parent = None','parent__isnull = True',和'parent_id__isnull = True'。所有四個都生成了'JOIN' – ctjctj2

+0

我發現你的問題提到你嘗試過 - 對不起,忽略了這一點。看起來這是Django中的一個錯誤:https://code.djangoproject.com/ticket/10790 - 儘管它看起來像1.6將成爲它修復的第一個版本。 –

+0

+ Peter DeGlooper,感謝您發現錯誤報告。我會考慮使用記錄的解決方法。 – ctjctj2