1

我有一个名为 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。一切正常,但现在我们要取消归档运行。所以我添加了 unfiltred_runs() 方法,它显示了所有运行的列表以及存档的运行。但是当我运行 recove_archived() 方法时,我得到以下错误

IntegrityError: UNIQUE constraint failed: run.id

我知道错误是因为数据库将其视为具有相同 ID 的新条目。我知道我可以完全覆盖 save 方法,但我想避免这种情况。

那么有没有办法在 unfiltered_runs() 查询集中而不是常规查询集中进行保存方法查找。

4

1 回答 1

0

按照@ivissani 的建议,我修改了我的recover_archived 方法,如下所示。它工作完美。

def recover_archived(self):
    # Some business logic
    Run.objects.unfiltered_runs().filter(pk=self.id).update(archived=False)
于 2019-12-20T22:27:44.660 回答