首页 > 解决方案 > 如何通过模型管理器分别查询设置管理员 django 和休息 api?

问题描述

如果我想返回所有行,则通过管理面板查询集中下面的代码仅返回 is_deleted 为“false”的行。我有一个想法,但不确定这是最好的还是没有错误。

所有模型都继承自该模型

class BaseModel(models.Model):
    is_deleted = models.BooleanField(default=False, verbose_name=_("is Deleted"))
    objects = BaseModelManager()
    ...

我为以下管理器的所有查询添加过滤器(is_deleted=false)(我无法删除此代码,因为所有 API 都使用此代码)

class BaseModelManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_deleted=False)

例如,样板书是

class Book(BaseModel):
    title = models.CharField(max_length=150)
    ...

在应用程序管理

@register(Book)
class BookAdmin(BaseAdminModel):
    list_display = ('title',)
    list_filter = ('is_deleted',)

类 BaseAdminModel 是

class BaseAdminModel(ModelAdmin):
    list_display = ('is_deleted',)

我的想法是像这样更改“基本模型”和“基本管理模型”

class BaseModelManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_deleted=False)

class AdminModelManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().all()

class BaseModel(models.Model):
    is_deleted = models.BooleanField(default=False, verbose_name=_("is Deleted"))
    objects = BaseModelManager()
    admin_objects = AdminModelManager()
    ...

class BaseAdminModel(ModelAdmin):
    list_display = ('is_deleted',)


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

标签: pythondjangodjango-querysetdjango-filterdjango-managers

解决方案


我个人会选择您的选项二解决方案。因此,将两个管理器附加到模型,一个用于已删除对象,另一个用于显示所有对象。

class Book(BaseModel):
    ...
    objects = BaseModelManger() # provides deleted=False
    all = models.Manager() # provides all results - default django manager

然后在您的管理员中覆盖该get_queryset功能。这将是未来最干净和最简单的解决方案。


推荐阅读