【问题标题】:Django: Filter foreignkey objects by default on modelDjango:默认在模型上过滤外键对象
【发布时间】:2017-07-27 22:53:33
【问题描述】:

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

例子:

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

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

【问题讨论】:

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


    【解决方案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()
    

    【讨论】:

    • 我会赞成使用管理器的建议,但是过滤器调用的语法是错误的。
    • 感谢@DanielRoseman 的反馈,我现在修好了电话。
    【解决方案2】:

    您可以将方法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 %}
    

    【讨论】:

    • 这很好用——不过我对其进行了调整。 self.families.filter(cars__isnull=False)
    猜你喜欢
    • 2021-11-17
    • 2018-02-03
    • 2013-09-23
    • 2012-07-15
    • 2018-03-19
    • 2021-04-03
    • 2013-02-02
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多