2012-12-05 124 views
1

所以,我掙扎在以下情況:查詢其父母有孩子在Django

考慮車型:

class A(models.Model): 
    foo = models.IntegerField(default=0) 

class B(models.Model): 
    a_models = models.ForeignKey('A', related_name='b_models') 
    bar = models.IntegerField(default=0) 

class bChild(B): 
    bla = models.IntegerField(default=0) 

,如果我有一個,a_instance一個實例,我想檢索的與它的關係在B類的所有實例,我可以用

all_b_models = a_instance.b_models.all() 

我的問題是:

:如果我想只檢索也有bChilds的那些什麼
all_bChild_models = a_instance.b_models.filter(???) 

我應該在「???」中放什麼?

我沒有找到任何文檔。有一件事我覺得工作原理是利用:

??? = pk__in=bChild.objects.all().values_list('pk') 

然而,由於Django的創建多表繼承隱式的落後的關係,我想知道是否有一個更簡單的查詢。

感謝, 豪爾赫

回答

1

有你爲什麼要取bChild對象只能通過一個實例時,你可以簡單地做的理由是:

result = bChild.objects.filter(a_models = a) 

你的做法是行不通的,你需要一個平板清單過濾pk:

all_bChild_models = a_instance.b_models.filter(pk__in = bChild.objects.values_list('pk', flat=True)) 
+0

好吧,我不知道有關過濾的「a_models」......在任何情況下,你能重新表達第一句話嗎?我不明白你的意思... –

+0

對不起,我的壞..我打算問你爲什麼你想直接在a_instance上查詢,當你可以直接在bChild表上直接進行查詢時。 –

1

嗯,我想通了自己。

顯然,如果模型沒有孩子,django認爲pk爲null。

因此,可以使用:

all_bChild_models = a_instance.b_models.filter(bchild__pk__isnull=False) 

這將返回其必須在它bChild模型指向的所有B型。