我们有一个Django DetailView,我们在其中显示一个对象(Site
)及其所有相关对象(Rooms
)。
现在,在模板中,我们可以简单地遍历RelatedManager集:
{% for room in site.room_set.all %}
do stuff
{% endfor %}
然而,问题是这会将所有相关的房间带到一个网站 - 但是,我们需要通过另一个属性来缩小此设置(让我们称之为{{1} }) - 此属性存储在Django会话变量中。
目前,我们只是在视图代码中使用year
,这很好。
我的问题更多来自好奇心 - 有没有办法在模板中使用Room.objects.filter(site=some_site, year='2009')
,还是过滤或缩小集合?
您是否可以编写自定义模型管理器来执行此操作,以便_set
只返回当前年份的对象?或者还有其他方式吗?
干杯, 维克多
答案 0 :(得分:3)
我的问题更多来自好奇心 - 有没有办法使用_set 模板,仍然过滤或缩小集合?
不是默认情况下,因为无法将参数传递给过滤器调用。
对于#3,有很多因素决定了这个代码的去向,没有通用的解决方案。你可以在你的视图中导入一个函数吗?使用模特经理?一个模型实例方法?情境处理器?等。
你能写一个自定义模型管理器来做这件事,所以_set会 只返回当年的对象?或者还有其他一些 方式是什么?
看起来您实际上只需使用模型管理器来处理反向相关模型。
class RoomManager(models.Manager):
def current_year(self):
return self.get_queryset().filter(year=datetime.date.today().year)
for room in site.room_set.current_year():
...
或仅在父模型上:
class Site(models.Model):
...
def year_room_set(self):
return self.room_set.filter(year=datetime.date.today().year)