問題

我使用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_oneTrue. 如果我刪除此記錄並檢索它,則會觸發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)總是成功.

  相同標籤的其他問題

pythondjangodjango-modelsdjango-reversion