Python 在Django中,如何将queryset过滤器优雅地添加到大型组或对象的所有成员中?
我们目前有一个媒体项目模型,它的发布日期决定了项目何时出现在我们的网站上。我们被要求添加指定打开项目的日期范围的功能。如果项目没有关联的日期范围,则其发布日期将决定是否显示。如果它有日期范围,则必须同时发布,并且必须在网站上显示的指定日期范围内 现在,一个显而易见的方法是遍历并修改代码中的每个查询集,添加一个过滤器以排除具有日期范围但不属于任何日期范围的项目。但是我们有很多这样的查询集,几乎所有的查询集都需要更改。所以我想知道是否有一些中心位置,我可以添加这个过滤器,这样它会影响所有查询集 当然,这需要以这样一种方式完成,即某些查询(即管理中的媒体项目列表)仍将显示所有项目。因此,我所追求的更多的是一种优雅的方式,它可以使用特定的过滤器影响一大组查询集,而不必在代码中找到每个实例。有什么想法吗?你要找的 比如:Python 在Django中,如何将queryset过滤器优雅地添加到大型组或对象的所有成员中?,python,django,filter,model,django-queryset,Python,Django,Filter,Model,Django Queryset,我们目前有一个媒体项目模型,它的发布日期决定了项目何时出现在我们的网站上。我们被要求添加指定打开项目的日期范围的功能。如果项目没有关联的日期范围,则其发布日期将决定是否显示。如果它有日期范围,则必须同时发布,并且必须在网站上显示的指定日期范围内 现在,一个显而易见的方法是遍历并修改代码中的每个查询集,添加一个过滤器以排除具有日期范围但不属于任何日期范围的项目。但是我们有很多这样的查询集,几乎所有的查询集都需要更改。所以我想知道是否有一些中心位置,我可以添加这个过滤器,这样它会影响所有查询集 当然
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\u 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
这是非常不幸的基础复制,因为没有办法显式覆盖管理员的管理器。一个更好的选择可能是将自定义管理器命名为筛选的\u对象
,并将默认管理器用作对象
,这正是它的用途。定义管理器子类并用查询覆盖get\u query\u set
。然后,您需要首先显式定义一个默认管理器,然后调用自定义的对象
,它应该可以正常工作
请注意,即使您可以这样做,我也建议您不要这样做。至少,给您的自定义管理器打个电话-例如
restricted
-并在代码中进行搜索和替换,以替换对自定义版本对象的引用。这让阅读您的代码的人意识到查询不是标准查询。感谢大家的帮助。到目前为止,我还没有对经理们做过太多的调查,所以这对我来说将是一次新的冒险。然而,在隧道的尽头有光明!