首页 > 解决方案 > 在 Django 中创建对象时如何设置字段属性?

问题描述

可以说我有一个这样的模型:

class Article(models.Model):
    title_max_length = models.IntegerField(default=255)
    title = models.CharField(max_length=self.title_max_length)

基本上,用户将设置 title_max_length,并且使用它,我们将在创建对象时设置标题字段 max_length。

有没有办法做到这一点?

标签: djangodjango-models

解决方案


max_length是一个“静态”列属性。列具有最大长度,而不是title特定记录的列。

因此,您不能设置max_length基于属性(与记录相关,或基于时间更改等)。更改max_length通常需要数据库迁移,因为大多数数据库需要知道最大长度。

但是,您可以验证title不超过给定的最大值例如通过覆盖Model.clean(..)方法

from django.core.exceptions import ValidationError

class Article(models.Model):
    title_max_length = models.IntegerField(default=255)
    title = models.CharField(max_length=self.title_max_length)

    def clean(self):
        if len(self.title) > self.title_max_length:
            raise ValidationError('Length of the title exceed maximum length')
        super(Article, self).clean()

(通常.clean(..)调用模型保存,仅通过表单等)。

Article然后,如果有人以这种方式创建或编辑 an,它将引发错误ModelForm

但无论如何,仍有办法规避检查。如果我们重写该函数也会发生这种情况.save(..)(尽管它也在模型层上强制执行,但 Django ORM 允许绕过.save(..).


推荐阅读