我有一个相当复杂的查询集,我目前在一个视图中使用它来获取对象列表。
我想在其他几个视图中使用相同的查询集,但不希望多次复制代码。我可以使用管理器将查询集保存在一个地方,并在每个视图中使用它,除了查询依赖于每个页面上不同的日期。
据我了解,管理员不允许你传递变量...所以我想知道我应该把这个查询放在哪里,以免在几个视图中不断重复它。有什么想法吗?
FWIW,这是我的查询集,published_date是在每个页面上更改的变量:
day_publications = Publication.objects.filter(
Q(reading__end_date__gte=published_date) | Q(reading__end_date__isnull=True),
reading__start_date__lte=published_date,
).select_related('series',)
答案 0 :(得分:8)
我认为你应该使用经理。我经常在我的经理中使用这样的方法:
class CustomManager(models.Manager):
def get_records(self, city_slug, dt):
filter_kwargs = {
'city__slug': city_slug,
'date_from__lt': dt,
'date_to__gt': dt,
}
return super(CustomManager, self).get_query_set().filter(**filter_kwargs)
然后我在我的模型上运行查询:
MyModel.objects.get_records(city.slug, datetime.now())
当然,您可以跟进另一个过滤器调用并将它们链接起来或做任何你想做的事情。这种方法没有任何问题,这就是管理者在这里的目的: - )。