繁体   English   中英

在 Django 查询中检索/过滤时,如何编写管理器 class 来设置模型的默认属性值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM