2011-01-31 100 views
7

我有兩個模型CategoryEntry。還有,從EntryDjango ForeignKey設置在繼承模型

class Category(models.Model): 
    title = models.CharField('title', max_length=255) 
    description = models.TextField('description', blank=True) 
    ... 

class Entry(models.Model): 
    title = models.CharField('title', max_length=255)  
    categories = models.ManyToManyField(Category) 
    ... 

class ExtEntry(Entry):  
    groups= models.CharField('title', max_length=255) 
    value= models.CharField('title', max_length=255) 
    ... 

繼承我能夠使用Category.entry_set,但我希望能夠做到Category.blogentry_set但它是不可用另一種模式ExtEntry。如果這是不可用的,那麼我就需要另一種方法來獲取所有ExtEntry與一個特定的Category

編輯 我的最終目標是有ExtEntry的一個QuerySet對象

感謝

回答

3

我需要另一種方法來獲取所有ExtEntryrelated到一個特定的類別

簡單:

ExtEntry.objects.filter(categories=my_category) 

你知道,如果有使用_set方式遺傳特徵

我不知道他們是否有直接的。這在文檔中沒有提及。

但是有可能得到與select_related類似的結果。

for e in category.entry_set.select_related('extentry'): 
    e.extentry # already loaded because of `select_related`, 
       # however might be None if there is no Extentry for current e 

有可能僅選擇項具有ExtEntry:

for e in category.entry_set.select_related('extentry').exlude(extentry=None): 
    e.extentry # now this definitely is something, not None 

關於排除壞的方面是它會產生terrybly低效的查詢:

SELECT entry.*, extentry.* FROM entry 
LEFT OUTER JOIN `extentry` ON (entry.id = extentry.entry_ptr_id) 
WHERE NOT (entry.id IN (SELECT U0.id FROM entry U0 LEFT OUTER JOIN 
         extentry U1 ON (U0.id = U1.entry_ptr_id) 
         WHERE U1.entry_ptr_id IS NULL)) 

所以我的簡歷會:使用ExtEntry.objects.filter()獲得您的結果。向後關係(object.something_set)只是一種方便,並不適用於任何情況。

2

參見文檔here爲解釋這是如何工作的。

基本上,因爲您可以獲取父模型項目,所以您應該能夠獲取其子項,因爲創建了隱式的一對一連接。

繼承關係引入了子模型與其父母(通過自動創建的OneToOneField)之間的鏈接。

所以,你應該能夠做到:

categories = Category.objects.all() 
for c in categories: 
    entries = c.entry_set.all() 
    for e in entries: 
     extentry = e.extentry 
     print extentry.value 

它不記錄在案,我可以看到,但我相信一般,你一到一個字段名稱將是一個低繼承模型名稱的類版本。

+0

感謝您的回覆!非常詳細和有益的。我可以看到你如何接近它,我的問題是我需要返回整個集合。如果我有10,000條目,但3 ExtEntry,這很多循環找到3項......但這肯定會工作 – neolaser 2011-01-31 23:01:55

+0

的確。我已經顯示所有類別,但記住,如果它只是一個特定的類別,肯定轉儲外部循環。我傾向於認爲如果您只需要三個ExtEntry對象與1000個對象,爲什麼不只是在Entry中使用`blank = True`字段? – 2011-01-31 23:09:32

0

您遇到的問題是因爲EntryExtEntry位於單獨的表格中。這對你來說可能是最好的解決方案,但是當你選擇使用多表繼承時,你應該意識到這一點。

category.entry_set.exclude(extentry=None)應該爲你工作。