Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中创建对象时,如何设置字段属性?_Django_Django Models - Fatal编程技术网

在Django中创建对象时,如何设置字段属性?

在Django中创建对象时,如何设置字段属性?,django,django-models,Django,Django Models,假设我有一个这样的模型: class Article(models.Model): title_max_length = models.IntegerField(default=255) title = models.CharField(max_length=self.title_max_length) 基本上,用户将设置title_max_length,使用它,我们将在创建对象时设置title字段max_length 有什么方法可以做到这一点吗?max\u length是一个

假设我有一个这样的模型:

class Article(models.Model):
    title_max_length = models.IntegerField(default=255)
    title = models.CharField(max_length=self.title_max_length)
基本上,用户将设置title_max_length,使用它,我们将在创建对象时设置title字段max_length


有什么方法可以做到这一点吗?

max\u length
是一个“静态”列属性。列具有最大长度,而不是特定记录的
标题

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

但是,您可以验证
标题是否未超过给定的最大值。例如,通过覆盖:

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

然后,如果有人以
ModelForm
的方式创建或编辑
文章,它将引发错误


但不管怎样,还是有办法绕过这一限制。如果我们重写
.save(..)
函数,也会发生这种情况(尽管在模型层上也会强制执行,但Django ORM允许绕过
.save(..)
)。

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

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

但是,您可以验证
标题是否未超过给定的最大值。例如,通过覆盖:

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

然后,如果有人以
ModelForm
的方式创建或编辑
文章,它将引发错误


但不管怎样,还是有办法绕过这一限制。如果我们重写
.save(..)
函数,也会发生这种情况(虽然在模型层上也会强制执行,但Django ORM允许绕过
.save(..)
)。

否,因为
max_length
是静态的,它是列的最大长度,所有记录的列定义都是相同的。但是,您可以制作一个验证器(例如在
.save()
.clean()
中)来检查您所做的操作是否有效。但是有些ORM调用可以避免这种情况。不,因为
max_length
是静态的,它是列的最大长度,并且列定义对于所有记录都是相同的。但是,您可以制作一个验证器(例如在
.save()
.clean()
中)来检查您所做的操作是否有效。但是,这可以通过一些ORM调用来规避。
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()