[英]How to write manager class to set default attribute value for models while retrieval/filtering in Django queries?
class StudentModelManager(models.Manager):
def get_queryset(self, *args, **kwargs):
return (
super(StudentModelManager, self)
.get_queryset()
.filter(is_deleted=False)
)
class StudentDetails(models.Model):
name = models.TextField(null=True, default=None)
is_deleted = models.BooleanField(default=False)
objects = StudentModelManager()
我在数据库 2 中有四个条目,其中is_deleted=False
和 2 有is_deleted=True
。
由于StudentModelManager
model 中的StudentDetails
我无法从数据库中检索is_deleted=True
的记录。
我想确保检索时的默认参数应该是is_deleted=False
,但是当像is_deleted=True
这样给出显式参数时,它应该返回具有该值的对象。
未将StudentModelManager
应用于StudentDetails
model 的 db 中的实际条目是:
>>> StudentDetails.objects.all()
<QuerySet [<StudentDetails: StudentDetails object (27)>, <StudentDetails StudentDetails object (29)>, <StudentDetails: StudentDetails object (30)>, <StudentDetails: StudentDetails object (28)>]>
通过将StudentModelManager
应用到StudentDetails
model 并使用is_deleted=False
从 db 检索的条目:
>>> StudentDetails.objects.all()
<QuerySet [<StudentDetails: StudentDetails object (27)>, <StudentDetails StudentDetails object (29)>]>
现在查看实际问题,无法使用is_deleted=True
检索条目
>>> StudentDetails.objects.filter(is_deleted=True)
<QuerySet []>
预期的 output是:
>>> StudentDetails.objects.filter(is_deleted=True)
<QuerySet [<StudentDetails: StudentDetails object (28)>, <StudentDetails StudentDetails object (30)>]>
这怎么可能实现?
根据您的要求,最好创建一个不同的经理来返回已删除的 StudentDetails。 如果更改默认管理器,则无法查询已删除对象,因为基础 QuerySet 已被过滤。
Django 文档建议使用不同的管理器。 (“您可以根据需要将任意数量的 Manager() 实例附加到 model。这是为您的模型定义通用“过滤器”的非重复方式。”)。
考虑到这一点,您可以使用以下内容:
class StudentModelManager(models.Manager):
def get_queryset(self, *args, **kwargs):
return (
super(StudentModelManager, self)
.get_queryset()
.filter(is_deleted=False)
)
class StudentDetails(models.Model):
name = models.TextField(null=True, default=None)
is_deleted = models.BooleanField(default=False)
objects = models.Manager()
existing_objects = StudentModelManager()
在获取现有对象的情况下,可以使用StudentDetails.existing_objects.all()
查询已删除对象的情况下,可以使用StudentDetails.objects.filter(is_deleted=True)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.