如何编写管理器 class 以在 Django 查询 retrieval/filtering 时为模型设置默认属性值?
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
.
由于 StudentDetails
模型中的 StudentModelManager
我无法从数据库中检索 is_deleted=True
的记录。
我想确保检索时的默认参数应该是 is_deleted=False
,但是当给出显式参数时
is_deleted=True
,它应该 return 个具有该值的对象。
数据库 中未应用 StudentModelManager
到 StudentDetails
模型的实际条目是:
>>> StudentDetails.objects.all()
<QuerySet [<StudentDetails: StudentDetails object (27)>, <StudentDetails StudentDetails object (29)>, <StudentDetails: StudentDetails object (30)>, <StudentDetails: StudentDetails object (28)>]>
从数据库 中检索到的条目将 StudentModelManager
应用于 StudentDetails
模型 is_deleted=False
:
>>> StudentDetails.objects.all()
<QuerySet [<StudentDetails: StudentDetails object (27)>, <StudentDetails StudentDetails object (29)>]>
现在查看实际问题,无法检索 is_deleted=True
的条目
>>> StudentDetails.objects.filter(is_deleted=True)
<QuerySet []>
预期输出是:
>>> StudentDetails.objects.filter(is_deleted=True)
<QuerySet [<StudentDetails: StudentDetails object (28)>, <StudentDetails StudentDetails object (30)>]>
如何实现?
根据您的要求,最好为已删除的 return StudentDetails 创建一个不同的管理器。如果更改默认管理器,将无法查询已删除的对象,因为基本 QuerySet 已被过滤。
不同管理者的使用is suggested by Django documentation。 (“您可以根据需要将任意数量的 Manager() 实例附加到模型。这是为模型定义通用“过滤器”的非重复方式。”)。
考虑到这一点,您可以使用以下内容:
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)
.
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
.
由于 StudentDetails
模型中的 StudentModelManager
我无法从数据库中检索 is_deleted=True
的记录。
我想确保检索时的默认参数应该是 is_deleted=False
,但是当给出显式参数时
is_deleted=True
,它应该 return 个具有该值的对象。
数据库 中未应用 StudentModelManager
到 StudentDetails
模型的实际条目是:
>>> StudentDetails.objects.all()
<QuerySet [<StudentDetails: StudentDetails object (27)>, <StudentDetails StudentDetails object (29)>, <StudentDetails: StudentDetails object (30)>, <StudentDetails: StudentDetails object (28)>]>
从数据库 中检索到的条目将 StudentModelManager
应用于 StudentDetails
模型 is_deleted=False
:
>>> StudentDetails.objects.all()
<QuerySet [<StudentDetails: StudentDetails object (27)>, <StudentDetails StudentDetails object (29)>]>
现在查看实际问题,无法检索 is_deleted=True
>>> StudentDetails.objects.filter(is_deleted=True)
<QuerySet []>
预期输出是:
>>> StudentDetails.objects.filter(is_deleted=True)
<QuerySet [<StudentDetails: StudentDetails object (28)>, <StudentDetails StudentDetails object (30)>]>
如何实现?
根据您的要求,最好为已删除的 return StudentDetails 创建一个不同的管理器。如果更改默认管理器,将无法查询已删除的对象,因为基本 QuerySet 已被过滤。
不同管理者的使用is suggested by Django documentation。 (“您可以根据需要将任意数量的 Manager() 实例附加到模型。这是为模型定义通用“过滤器”的非重复方式。”)。
考虑到这一点,您可以使用以下内容:
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)
.