如何编写管理器 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 个具有该值的对象。

数据库 中未应用 StudentModelManagerStudentDetails 模型的实际条目是:

>>> 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).