2017-03-07 162 views
0

我有3種模型創建數據層次結構:品牌,家庭,汽車。在顯示品牌的DetailView時,我有一個品牌家族(foreignkey)的桌子,然後在那張桌子上,我有一個num_cars屬性,用於顯示帶有一個外鍵的汽車數量。Django:在默認情況下過濾外鍵對象

例子:

Brand:Ford 

Families: 
Taurus 150 
F150 100 
F250 0 

這顯示在我的模板:

{% for family in brand.families.all %} 
    {{ family }} {{ family.num_cars }} 
{% endfor %} 

有沒有辦法來過濾通過的汽車數量的家庭,所以我不看結果,其中有是0輛汽車?我可以在模板中做到這一點:

{% for family in brand.families.all %} 
{% if family.num_cars > 0 %} 
    {{ family }} {{ family.num_cars }} 
{% endif %} 
{% endfor %} 

但是,這似乎不是理想的解決方案。我想在我的模型中有這個(如果可能的話)。有任何想法嗎?

回答

0

您可以將方法get_families添加到模型Brand

class Brand(models.Model): 
    title = models.CharField() 

    def get_families(self): 
     return self.families.filter(num_cars__gt = 0) 

然後做你的看法是這樣的。

{% for family in brand.get_families %} 
    {{ family }} {{ family.num_cars }} 
{% endfor %} 
+0

這個工作太好了 - 我調整它雖然。 self.families.filter(cars__isnull = False) – Emile

1

您可以使用Django中的自定義管理器實現這種行爲。 https://docs.djangoproject.com/en/1.10/topics/db/managers/ 例如

class FamilyWithCarManager(models.Manager): 
    def get_query_set(self): 
     return super(FamilyWithCarManager, self).get_query_set().filter(num_cars__gte=0) 

,然後在你的家庭模式:

class Family(models.Model): 
    name = models.CharField(max_length=50) 
    with_cars = FamilyWithCarManager() 

,那麼你應該能夠編寫這樣的查詢:

Family.with_cars.all() 
+0

我會鼓勵使用管理員的建議,但過濾器調用的語法是錯誤的。 –

+0

感謝您的反饋@DanielRoseman我現在確定了電話。 – matyas