【问题标题】:Where to put common queries in Django?在 Django 中将常见查询放在哪里?
【发布时间】:2011-05-31 07:38:06
【问题描述】:

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

我想在其他几个视图中使用相同的查询集,但不希望只是多次复制代码。我可以使用管理器,将查询集保存在一个地方,并在每个视图中使用它除了,查询依赖于每个页面上不同的日期。

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

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',)

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    我认为您实际上应该使用管理器。我习惯性地在我的经理中使用这样的方法:

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

    当然,您可以跟进另一个过滤器调用并将它们链接起来,或者做任何您想做的事情。这种方法没有错,这就是经理们在这里的目的:-)。

    【讨论】:

    • 当然,谢谢。我被文档所抛弃,没有建议您可以将值传递给 Manager 函数。我应该尝试一下!
    • 必须使用get_queryset 而不是get_query_set
    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2012-07-04
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多