django-reversion 与模型清理方法冲突
django-reversion conflict with models clean method
我使用 django-reversion 来控制我模型的更改,但我对模型清理方法有疑问。
例如我的模型是这样的:
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
现在我在管理部分为文档创建一条记录,引用一个模板,其中字段 only_one
是 True
。
如果我删除此记录并检索它,则会触发 ValidationError。
为什么?因为我删除了唯一可用的记录。很好奇...
对任何更新执行清理。如果您因此编辑您的Document
,那么它也会检查给定的条件。由于那个条件成立:模板有only_one=True
,并且有这样的文档(你的文档),所以会引发一个ValidationError
.
因此您需要从查询集中排除当前项目:
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 <b>self.pk is not None</b>:
<b>qs = qs.exclude(pk=self.pk)</b>
if self.template.only_one and qs.exists():
raise ValidationError('A document with this template already exists')
return super().clean()
如果这样设置了主键,我们可以从查询集中排除该主键。事实上,我们在这里不需要 if 条件,因为 .exclude(pk=None)
无论如何都会成功。
我使用 django-reversion 来控制我模型的更改,但我对模型清理方法有疑问。
例如我的模型是这样的:
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
现在我在管理部分为文档创建一条记录,引用一个模板,其中字段 only_one
是 True
。
如果我删除此记录并检索它,则会触发 ValidationError。
为什么?因为我删除了唯一可用的记录。很好奇...
对任何更新执行清理。如果您因此编辑您的Document
,那么它也会检查给定的条件。由于那个条件成立:模板有only_one=True
,并且有这样的文档(你的文档),所以会引发一个ValidationError
.
因此您需要从查询集中排除当前项目:
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 <b>self.pk is not None</b>:
<b>qs = qs.exclude(pk=self.pk)</b>
if self.template.only_one and qs.exists():
raise ValidationError('A document with this template already exists')
return super().clean()
如果这样设置了主键,我们可以从查询集中排除该主键。事实上,我们在这里不需要 if 条件,因为 .exclude(pk=None)
无论如何都会成功。