Django 在 admin 中覆盖管理器

nob*_*be4 0 django model django-admin

我有一个使用自定义管理器的模型:

class ProjectManager(models.Manager):
    def get_queryset(self):
        return super(ProjectManager, self).get_queryset() \
            .exclude(archived_date__isnull=False)


class Project(models.Model):
    objects = ProjectManager()
    archived_date = models.DateTimeField(null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

但我还没有找到一种方法来显示管理中的所有项目。

我的管理员定义如下:

class ProjectAdmin(admin.ModelAdmin):
    model = Project
Run Code Online (Sandbox Code Playgroud)

get_queryset我尝试在课堂上使用ProjectAdmin,但我无法找到恢复所有项目的方法。

你知道怎么做吗?

jus*_*vey 5

您需要将经理设置为默认经理。

objects = ProjectManager() # The default manager.
Run Code Online (Sandbox Code Playgroud)

来源:https://docs.djangoproject.com/en/4.1/topics/db/managers/#modifying-a-manager-s-initial-queryset

编辑:

这可能不是最好的解决方案,但它会起作用。

模型.py:

class Project(models.Model):
    objects_unfiltered = models.Manager()
Run Code Online (Sandbox Code Playgroud)

管理员.py

class ProjectAdmin(admin.ModelAdmin):
    model = Project

    def get_queryset(self, request):
        return self.model.objects_unfiltered.all()

admin.site.register(Project, ProjectAdmin)
Run Code Online (Sandbox Code Playgroud)