Django 中的常见查询应该放在哪里?

发布于 2024-10-09 01:12:33 字数 492 浏览 1 评论 0原文

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

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

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

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

I have a queryset that is reasonably complicated, which I currently use in a single view for getting a list of objects.

I want to use the same queryset in a couple of other views but would prefer not to just copy the code multiple times. I could use a Manager, to keep the queryset in one place, and use that in each view except the query relies on a date which is different on each page.

As I understand it, Managers don't let you pass in variables... so I'm wondering where I should put this query so as not to keep repeating it in several views. Any thoughts?

FWIW, this is my queryset, and published_date is the variable that changes on each page:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

慕烟庭风 2024-10-16 01:12:33

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

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

当然,您可以跟进另一个过滤器调用并链接这些方法或做任何您想做的事情。这种方法没有任何问题,这就是管理者的目的:-)。

I think you should actually use a Manager. I habitually use methods like this in my managers:

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)

Then I run the query on my model:

MyModel.objects.get_records(city.slug, datetime.now())

Of course, you can follow up with another call of filter and chain these or do whatever you want. There's nothing wrong with this kind of approach, that's what managers are here for :-).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文