如何在 Django 软删除中编码或如何在模型中过滤查询?

How to code in django soft delete or how to filter query in model?

如何在模型中过滤查询?

class ABC(models.Model):
soft_delete = models.IntegerField(blank=True, null=True, default=0)
    class Meta:
        managed = False
        db_table = 'ABC'
    <SOMETHING FUNCTION>

我可以在这里写一些这样的函数吗

def get():
    queryset = ABC.objects.filter(soft_delete=0)
    retuen queryset

或任何其他解决方案?

实例将被软删除或可见。所以 soft_delete 应该是一个布尔字段。

class ABC(models.Model):
    soft_delete = models.BooleanField(default=False)
    # other fields

然后你可以用这个查询得到软删除的对象:

queryset = ABC.objects.filter(soft_delete=True)

其他未被软删除的对象:

queryset = ABC.objects.filter(soft_delete=False)

所有对象:

queryset = ABC.objects.all()

一般来说,自定义管理器是这项任务的理想人选。示例为:

from core.managers import ABCManager

class ABC(models.Model):
    soft_delete = models.BooleanField(default=False)
    # other fields
    objects = ABCManager()
    # active = ABCActiveManager()

将您的经理存储在单独的文件中 (managers.py):

from django.db.models import Manager

class ABCManager(Manager):
    def get_queryset(self):
        query = super().get_queryset()

        query = query.filter(soft_delete=False)

        return query

但这是一个全局解决方案,objects 将始终 return 个具有 soft_delete=False 的实例。如果(最有可能)当您还需要获取已删除的对象时,您可以使用不同的方式覆盖默认(对象)管理器名称。


此外,您可以使用 class 方法解决问题:

class ABC(models.Model):
    soft_delete = models.BooleanField(default=False)

    @classmethod
    def active_records(cls):
        return cls.objects.filter(soft_delete=False)

然后在 class 级别调用它,如下所示:

ABC.active_records()
# <QuerySet [<ABC: ABC object (1)>, <ABC: ABC object (2)>]>

很难提出解决方案,因为它实际上取决于您以后将如何使用它。