конфликт реверсии django с методом очистки моделей - PullRequest
1 голос
/ 29 сентября 2019

Я использую 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.Почему?Потому что я удалил единственную доступную запись.Очень любопытно ...

1 Ответ

1 голос
/ 29 сентября 2019

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

...