Чистка выполняется при любом обновлении.Если вы, таким образом, отредактируете свой 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)
всегда будет успешным.