我有一个名为 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() 查询集中而不是常规查询集中进行保存方法查找。