自定义管理器在现场筛选对象,而不是在管理中?

wr98u20j  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(122)

我遵循了this example,它工作得很好,但我想知道我是否可以加入一个异常,这样当我在管理员中时,所有对象都会显示出来(活动的和非活动的)。这可能很简单,但我在文档中找不到如何做到这一点。

下面是我的经理现在的样子:

class ShareManager(models.Manager):
    def get_query_set(self):
        return super(ShareManager, self).get_query_set().filter(active=True)
jdgnovmf

jdgnovmf1#

脑海中浮现出以下几种解决方案:

1.使用ModelAdmin.queryset()定义要用于变更列表的查询集。
1.在您的模型上安装2个管理器,管理员找到的第一个管理器将被用作默认管理器AFAIK。

class SomeThing(models.Model):
   objects = models.Manager()
   shares = ShareManager()

1.在仅返回活动内容的自定义管理器上添加新方法,并保留get_query_set的默认设置。

class ShareManager(models.Manager):
    def get_active_items(self):
        return self.get_query_set().filter(active=True)

跟进

我认为最适合你的解决方案是将#1和#2的变体结合起来。

将您的自定义管理器设置为objects,这样每个人都可以访问它(我认为这应该可以解决您的可重用性问题),还可以在您的模型上安装默认管理器,并在ModelAdmin.queryset()中使用它。

class SomeThing(models.Model):
       objects = ShareManager()
       admin_objects = models.Manager()

我也应该包括ModelAdmin.queryset()方法示例,所以它就在这里。

def queryset(self, request):
        qs = self.model.admin_objects.get_query_set()
        # TODO: this should be handled by some parameter to the ChangeList.
        # otherwise we might try to *None, which is bad ;)
        ordering = self.ordering or () 
        if ordering:
            qs = qs.order_by(*ordering)
        return qs

注意,qs = self.model.admin_objects.get_query_set()行使用的是admin_objects,它是普通管理器的示例,包括未发布的项目。

queryset方法的其余实现是默认的Django实现,通常称为qs = self.model._default_manager.get_query_set()

我希望这能把事情弄清楚一点。

相关问题