Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中,如何将queryset过滤器优雅地添加到大型组或对象的所有成员中?_Python_Django_Filter_Model_Django Queryset - Fatal编程技术网

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
-并在代码中进行搜索和替换,以替换对自定义版本对象的引用。这让阅读您的代码的人意识到查询不是标准查询。

感谢大家的帮助。到目前为止,我还没有对经理们做过太多的调查,所以这对我来说将是一次新的冒险。然而,在隧道的尽头有光明!