在Django中,公共查询应该放在哪里?

6

我有一个相当复杂的查询集,目前我在单个视图中使用它来获取对象列表。

我想在其他几个视图中使用相同的查询集,但不想多次复制代码。我可以使用Manager将查询集保留在一个位置,并在每个视图中使用它,除了查询依赖于每个页面上不同的日期。

据我所知,管理器不允许您传递变量...所以我想知道我应该把这个查询放在哪里,以便不在多个视图中重复它。有什么想法吗?

顺便说一句,这是我的查询集,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',)
1个回答

9

我认为你应该使用 Manager。在我的 Manager 中,我习惯使用如下的方法:

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())

当然,你可以跟进另一个filter并链接它们,或者做任何你想做的事情。这种方法没有问题,这就是管理人员存在的原因 :-)。

当然,谢谢。我被文档没有建议您可以将值传递给Manager函数所困扰。我应该尝试一下! - Phil Gyford
不得不使用 get_queryset 而不是 get_query_set - jozxyqk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接