首页 > 解决方案 > 多对多关系不适用于我想要的 django-safedelete

问题描述

我正在使用一个名为 django-safedelete 的库来避免从数据库中永久删除记录,该技术称为“safedelete”。这是图书馆的文档 https://django-safedelete.readthedocs.io/en/latest/managers.html

我有一个问题,当我在演员和电影(参与)之间的中间表中软删除一条记录时,QuerySet 完全忽略它,我的意思是当我执行查询以了解演员在哪部电影中时,Queryset 忽略连接演员和电影的中间寄存器是软删除的,无论如何都会显示演员参演的电影。

这是发生的事情的一个例子:

>>> Actor.objects.get (pk = 1)
<Actor: Actor object (1)>

>>> Film.objects.get (pk = 1)
<Film: Film object (1)>

>>> Participation.objects.all_with_deleted (). Values ​​('id', 'actor', 'film', 'deleted')
<SafeDeleteQueryset [{'id': 1, 'actor': 1, 'film': 1, 'deleted': datetime.datetime (2021, 9, 4, 0, 43, 50, 125046, tzinfo = <UTC>) }]>

>>> Actor.objects.get (pk = 1) .films.all ()
<SafeDeleteQueryset [<Film: Film object (1)>]>

如您所见,它忽略了参与记录是软删除,并且还显示了演员参与的电影,如果参与是软删除,我需要的是不显示演员参与了该电影

我希望我已经很好地解释了自己,谢谢。

from safedelete.config import DELETED_VISIBLE_BY_PK
from safedelete.models import SafeDeleteModel, SOFT_DELETE
from safedelete.managers import SafeDeleteManager

class ModelManager(SafeDeleteManager):
    _safedelete_visibility = DELETED_VISIBLE_BY_PK

class Film(SafeDeleteModel):
    _safedelete_policy = SOFT_DELETE
    objects = ModelManager()

    name = models.CharField(max_length=50)
    actors = models.ManyToManyField(to='movies.actor', related_name='films', through='movies.participation')

class Actor(SafeDeleteModel):
    _safedelete_policy = SOFT_DELETE
    objects = ModelManager()

    name = models.CharField(max_length=50)

class Participation(SafeDeleteModel):
    _safedelete_policy = SOFT_DELETE
    objects = ModelManager()

    main_character = models.BooleanField(default=False)
    character_name = models.CharField(max_length=50, default='')
    film = models.ForeignKey(to='movies.film', on_delete=models.CASCADE, related_name='participations')
    actor = models.ForeignKey(to='movies.actor', on_delete=models.CASCADE, related_name='participations')

标签: djangodjango-modelsmany-to-manydjango-ormsoft-delete

解决方案


推荐阅读