django - 在 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。
有没有办法做到这一点?
解决方案
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(..)
.
推荐阅读
- routes - 使用 OctoberCMS 显示单个类别的帖子
- mongodb - 使用 Logstash 将数据从 mongoDB 同步到 elasticsearch
- node.js - Npm install 忽略版本号中的波浪号 (~)
- mongodb - OpsManager mongodb 部署问题添加 PLAIN auth
- python - 使用 cronjob 运行杂乱无章但不是预期的结果
- julia - 如何在 Julia 中重复数组中的值?
- python - Python ElementTree 脚本在写入 CSV 输出时复制 XML 数据
- linux - 通过搜索最新文件确定备份是否运行
- javascript - 将数组的数组与其反转的元素连接起来
- wpf - (WPF) 如何在后面的代码中找到关于两个 ItemsControl 的祖先?