2017-03-07 164 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