python - django-reversion 与模型清理方法冲突
问题描述
我使用 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
现在我在管理部分中为 Document 创建一条记录,引用该字段所在的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 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()
如果这样设置了主键,我们可以从查询集中排除该主键。事实上,我们在这里不需要 if 条件,因为.exclude(pk=None)
无论如何都会成功。
推荐阅读
- c# - 从 DSL 中解析变量名和数组索引
- azure - 是否可以通过 Azure API 创建具有开放端口的 Azure VM?
- firebase - 如何解决我用 express 开发的 api 中的 firebase 身份验证问题?
- junit - Kafka Streams TopologyTestDriver 在 Windows 上失败
- tsql - OPENJSON 在兼容级别设置为 130 的 SQL Server 2016 上不可用
- amazon-web-services - 如何使用 yaml 文件触发 AWS lambda 邮件
- azure - Azure 异常检测器 - 仅检测峰值
- c++ - 为什么我不能在未链接的 DLL 上调用方法但可以这样做?C++
- pytorch - 在将 GPU 用于 PyTorch 模型时,出现 CUDA 错误:未知错误?
- php - 从 HTML 调用 PHP 函数