在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()