python - 如何通过模型管理器分别查询设置管理员 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()
解决方案
我个人会选择您的选项二解决方案。因此,将两个管理器附加到模型,一个用于已删除对象,另一个用于显示所有对象。
class Book(BaseModel):
...
objects = BaseModelManger() # provides deleted=False
all = models.Manager() # provides all results - default django manager
然后在您的管理员中覆盖该get_queryset
功能。这将是未来最干净和最简单的解决方案。
推荐阅读
- c# - 如何使用脚本启动另一个脚本
- python - 使用 pyinstaller 打包 matplotlib 时出现问题 - PyQt5.QtX11Extras 模块未找到错误
- tensorflow - TensorFlow 中实现的 Luong Attention 的第二种形式是什么?
- vba - Word VBA Range.Find 更改样式
- matlab - 使用成本函数的 MATLAB 非线性回归
- javascript - 粘性导航保证金不适用于移动设备
- css - 放入网站后带有标签的滑块问题
- biztalk - 使用 Xml Disassembler 创建用于自动分批的 BizTalk 架构,导致 BizTalk 和 TypeName 冲突中的重复架构
- html - 在 Python/Pandas 中提取 HTML 标记中的单词
- c# - 实体的深层复制导致“实体类型‘X’上的属性‘Id’是键的一部分,因此不能修改或标记为已修改