Django自定义反向Foreignkey查找管理器(相关管理器)



我使用自定义模型管理器进行软删除,并希望进行反向Foreignkey查找(Related Manager(。

经理:

class SoftDeletionQuerySet(QuerySet):
def delete(self):
return super(SoftDeletionQuerySet, self).update(deleted_at=timezone.now())
def hard_delete(self):
return super(SoftDeletionQuerySet, self).delete()
def alive(self):
return self.filter(deleted_at=None)
def dead(self):
return self.exclude(deleted_at=None)

class SoftDeletionManager(models.Manager):
use_for_related_fields = True
def __init__(self, *args, **kwargs):
self.status = kwargs.pop("status", "all")
super(SoftDeletionManager, self).__init__(*args, **kwargs)
def get_queryset(self):
if self.status == "alive":
return SoftDeletionQuerySet(self.model).filter(deleted_at=None)
elif self.status == "dead":
return SoftDeletionQuerySet(self.model).exclude(deleted_at=None)
else:
return SoftDeletionQuerySet(self.model)
def hard_delete(self):
return self.get_queryset().hard_delete()

class SoftDeletionModel(models.Model):
deleted_at = models.DateTimeField(blank=True, null=True)
objects = SoftDeletionManager(status="alive")
dead_objects = SoftDeletionManager(status="dead")
all_objects = SoftDeletionManager()
class Meta:
abstract = True
def delete(self):
self.deleted_at = timezone.now()
self.save()
def hard_delete(self):
super(SoftDeletionModel, self).delete()

用于型号:

class Sowi(SoftDeletionModel):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

现在,对于给定的user,我想得到他的user.sowi_set,但只想得到那些"活着"的SoWi。"正常"user.sowi_set还返回失效的元素,即具有deleted_at值的元素!=没有一个如何只获取有生命的对象?

提前感谢!

当调用user.sowi_set.all()时,您的管理器将通过django自动初始化,参数为空。为了解决这个问题,我寻找了在django初始化manager时传递参数的方法。然后,我发现了这个问题。

您必须像这样更改代码。

def manager_factory(status=None):
class SoftDeletionManager(models.Manager):
deletion_status = status
use_for_related_fields = True
def get_queryset(self):
if self.deletion_status == "alive":
return SoftDeletionQuerySet(self.model).filter(deleted_at=None)
elif self.deletion_status == "dead":
return SoftDeletionQuerySet(self.model).exclude(deleted_at=None)
else:
return SoftDeletionQuerySet(self.model)
def hard_delete(self):
return self.get_queryset().hard_delete()
return SoftDeletionManager()

class SoftDeletionModel(models.Model):
deleted_at = models.DateTimeField(blank=True, null=True)
objects = manager_factory("alive")
dead_objects = manager_factory("dead")
all_objects = manager_factory()
class Meta:
abstract = True
def delete(self):
self.deleted_at = timezone.now()
self.save()
def hard_delete(self):
super(SoftDeletionModel, self).delete()

最新更新