gpt4 book ai didi

python - 在 Django 中,如何优雅地将查询集过滤器添加到一个大组或一个对象的所有成员?

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:46 25 4
gpt4 key购买 nike

我们目前有一个媒体项目模型,其发布日期决定了该项目何时会出现在我们的网站上。我们被要求添加指定项目开启日期范围的功能。如果一个项目没有关联的日期范围,它的发布日期将决定它是否显示。如果它有日期范围,则它必须既已发布又必须在指定的日期范围之一内才能显示在网站上。

现在显而易见的方法是遍历并修改我们代码中的每个查询集,添加一个过滤器以排除具有日期范围但不属于任何日期范围的项目。但是我们有很多这样的查询集,而且几乎所有这些查询集都需要更改。所以我想知道是否有某个中心位置可以添加此过滤器,以便它会影响所有查询集。

当然,这需要以某些查询(即管理中的媒体项目列表)仍会显示所有项目的方式来完成。因此,我所追求的是一种优雅的方式来影响具有特定过滤器的大量查询集,而无需在代码中找到每个实例。有什么想法吗?

最佳答案

您正在寻找 model managers .

类似于:

class MediaItemManager(models.Manager):
def get_queryset(self):
return super(MediaItemManager, self).get_queryset().filter(...)

您可以像这样将其设置为模型的默认管理器:

class MediaItem(models.Model):
objects = MediaItemManager()
all_objects = models.Manager()

您可以通过在您的 ModelAdmin 子类上指定 get_queryset 来确保这不会影响管理员:

class MyModelAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = self.model.all_objects.get_queryset()
ordering = self.get_ordering(request)
if ordering:
qs = qs.order_by(*ordering)
return qs

这是基数 get_queryset method 的不幸重复,因为没有办法显式覆盖管理员的经理。更好的替代方法可能是将自定义管理器命名为 filtered_objects,并将默认管理器用作 objects

关于python - 在 Django 中,如何优雅地将查询集过滤器添加到一个大组或一个对象的所有成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27380036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com