如何强制Django model save方法在自定义管理器方法中查找queryset?

2024-05-14 12:34:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为Run的模型,其中有一个名为RunManager的管理器和一个自定义save()方法,如下所示

class RunManager(models.Manager):
    use_for_related_fields = True
    def get_queryset(self):
        queryset = super(RunManager, self).get_queryset()
        queryset = queryset.filter(archived=False)
        return queryset

    def unfiltered_runs(self):
        queryset = super(RunManager, self).get_queryset()
        return queryset

class Run(models.Model):
    name = models.CharField(max_length=256)
    archived = models.BooleanField(default=False)
    objects = RunManager()

    def save(self, *args, **kwargs):
        # some business logic
        super(Run, self).save(*args, **kwargs)

    def archive(self):
        # Some business logic
        self.archived = True
        self.save()

    def recover_archived(self):
        # Some business logic
        self.archived = False
        self.save()

这是一个旧代码,其中run.objects在多个位置使用,因此为了隐藏存档的运行,我使用RunManager。 一切正常,但现在我们想取消运行的存档。因此,我添加了unfilted_runs()方法,该方法显示所有运行的列表以及存档的运行。但是当我运行recove\u archived()方法时,我得到以下错误

IntegrityError: UNIQUE constraint failed: run.id

我知道这个错误是因为db将其视为具有相同id的新条目。 我知道我可以完全重写save方法,但我想避免这种情况

那么,有没有什么方法可以在未筛选的\u runs()查询集中而不是在常规查询集中进行save方法查找呢


Tags: 方法runselffalsegetmodelssavedef
1条回答
网友
1楼 · 发布于 2024-05-14 12:34:51

按照@ivissani的建议,我修改了我的recover\u归档方法如下。它工作得非常完美

def recover_archived(self):
    # Some business logic
    Run.objects.unfiltered_runs().filter(pk=self.id).update(archived=False)

相关问题 更多 >

    热门问题