Django:默认情况下在模型上过滤外键对象

时间:2017-03-07 16:22:55

标签: django django-models django-templates django-queryset

我有3个模型,用于创建数据层次结构:品牌,家庭,汽车。在显示品牌的DetailView时,我有一个带有Brand系列的表(foreignkey),然后在该表中,我有一个num_cars属性,用于显示带有外键的汽车数量。 / p>

示例:

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 %}

然而,这似乎不是理想的解决方案。我希望在我的模特中有这个(如果可能的话)。有什么想法吗?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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 %}