Django:在默认情况下过滤外键对象
我有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 %}
但是,这似乎不是理想的解决方案。我想在我的模型中有这个(如果可能的话)。有任何想法吗?
您可以将方法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 %}
您可以使用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()
我会鼓励使用管理员的建议,但过滤器调用的语法是错误的。 –
感谢您的反馈@DanielRoseman我现在确定了电话。 – matyas
这个工作太好了 - 我调整它虽然。 self.families.filter(cars__isnull = False) – Emile