Python django回归与模型清理方法冲突

Python django回归与模型清理方法冲突,python,django,django-models,django-reversion,Python,Django,Django Models,Django Reversion,我使用django反转来控制模型的更改,但是我对模型清理方法有一个问题 例如,我的模型如下所示: class Document(models.Model): name = models.CharField(max_length=255, blank=True, null=True) client = models.ForeignKey(Client, on_delete=models.CASCADE) template = models.ForeignKey(Templa

我使用django反转来控制模型的更改,但是我对模型清理方法有一个问题

例如,我的模型如下所示:

class Document(models.Model):
    name = models.CharField(max_length=255, blank=True, null=True)
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    template = models.ForeignKey(Template, on_delete=models.CASCADE)

    def clean(self):
        if self.template.only_one and (Document.objects.filter(client=self.client, template=self.template).count() > 0):
            raise ValidationError('Test')
我在admin.py中注册此模型:

@admin.register(Document)
class DocumentReversion(VersionAdmin):
    pass
现在,我在管理部分创建了一个文档记录,引用了一个模板,其中字段
只有一个
True
。 如果我删除并检索该记录,将触发ValidationError。
为什么?因为我已经删除了唯一可用的记录。非常奇怪…

任何更新都会执行清理。如果您这样编辑
文档
,那么它也会检查给定的条件。由于该条件成立:模板只有一个=True
,并且存在这样的文档(您的文档),因此它将引发一个
验证错误

因此,您需要从查询集中排除当前项:

class Document(models.Model):
    name = models.CharField(max_length=255, blank=True, null=True)
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    template = models.ForeignKey(Template, on_delete=models.CASCADE)

    def clean(self):
        qs = Document.objects.filter(client_id=self.client_id, template_id=self.template_id)
        if self.pk is not None:
            qs = qs.exclude(pk=self.pk)
        if self.template.only_one and qs.exists():
            raise ValidationError('A document with this template already exists')
        return super().clean()
类文档(models.Model):
name=models.CharField(max_length=255,blank=True,null=True)
client=models.ForeignKey(client,on_delete=models.CASCADE)
template=models.ForeignKey(模板,on_delete=models.CASCADE)
def清洁(自清洁):
qs=Document.objects.filter(客户机\u id=self.client\u id,模板\u id=self.template\u id)
如果self.pk不是None:
qs=qs.exclude(pk=self.pk)
如果self.template.only_one和qs.exists():
raise ValidationError('具有此模板的文档已存在')
返回super().clean()
如果这样设置了主键,我们可以从queryset中排除该主键。事实上,这里不需要if条件,因为
.exclude(pk=None)
无论如何都会成功。

因为对现有文档调用了
clean()
,因此
self.template。只有一个
document.objects.filter(…).count()
也是true,因此它会引发错误。