模板中的Django过滤器related_name子集

时间:2019-03-19 08:29:18

标签: django foreign-keys

我有一个外键,并且正在使用related_name字段,如下所示:

class Pizza(models.Model):
   ...
   restaurant = models.ForeignKey('Restaurant', related_name='pizzas_offered')
   active = models.BooleanField(...)
   ...

视图中的示例:

my_restaurant = get_object_or_404(Restaurant, pk=id)

在任何模板中,我都可以运行 my_restaurant.pizzas_offered.all 之类的东西,以获取属于特定餐厅的所有披萨。但是,我只想要活动的披萨(active = True)。有没有一种方法可以检索模板中的此子集,而不必在视图中传递单独的变量?请注意,我始终只希望仅显示活动的比萨饼,因此,如果我必须对模型进行更改以使这种情况发生,那也很好。

注意:在视图中,我可以简单地传递 my_restaurant.pizzas_offered.filter(active = True),但是当我在模板中使用它时会返回错误:

{% for details in my_restaurant.pizzas_offered.filter(active=True) %}
  {{ details.name }}
{% endfor %}

它返回此错误: 无法解析其余部分:“(active = True)”

出于某些原因,我想在模板级别而不是视图中执行此操作(主要原因是:我经常遍历数据库中的所有记录,而不仅仅是浏览一家餐馆,所以我不能只查询一条记录)。所以我的问题是如何在模板级别执行此操作。

1 个答案:

答案 0 :(得分:0)

您需要为Manager模型创建Pizza并设置Meta.base_manager_name

class PizzaManager(models.Manager):
    def active(self):
        return self.filter(status=True)

class Pizza(models.Model):
    ...
    objects = PizzaManager()

    class meta:
        base_manager_name = 'objects'

现在,您可以在模板中使用方法active

{% for details in my_restaurant.pizzas_offered.active %}
    ...
{% endfor %}

有关更多信息,您可以阅读有关Default and Base managers的文档。