所以我有一个具有以下属性的书模型:
title = models.CharField(max_length=250)
在管理员或模型表单中,这将不允许保存空字符串,因为默认情况下为blank = False。但在我的情况下,我正在解析xml并以这种方式创建模型,所以我根本不使用任何形式。
所以我想知道我可以设置一个不允许空字符串的约束,还是我必须编写模型字段或调整我的解析器?
答案 0 :(得分:6)
您仍然可以使用表单来验证数据并创建模型对象,因为ModelForm会返回它创建的对象。我在对.xls文件中的模型进行批量更新时使用了这种方法,效果很好。
以这种方式使用表单还可以让您有机会记录出错的错误,启动其他进程或任何您喜欢的内容。
它还可以减轻您手动编辑数据库的负担,如果字符串为空,表单也可以插入默认值。
希望能帮到你。
答案 1 :(得分:4)
Django模型的默认值为blank=False
,适用于表单验证,null=False
,表示数据库不能包含NULL
。如果您不使用表单来实例化模型实例,这些都不会阻止空字符串保存在您的数据库中。
在不使用表单的情况下执行此操作的好方法(例如,如果您尝试使用create
或get_or_create
实例化该类),请override the model's clean
method and call full_clean
in the save
method:
from django.core.exceptions import ValidationError
def clean(self):
if self.title == "":
raise ValidationError("Database should not contain an empty string title!")
def save(self):
self.full_clean()
super(YourModel, self).save(*args, **kwargs)
在您的情况下,您可以将验证放入save
函数中。覆盖clean
方法并在保存方法中调用full_clean
的好处是,ValidationError
将添加到表单的non_field_errors
。
答案 2 :(得分:1)
MySQL对约束的支持有限,因此您必须使用触发器(see here for more about how to use trigger s)或调整解析器。
假设您没有将NULL作为字段值,那么您可以将模型字段设置为null=False
(null纯粹与数据库相关,而空白与验证相关)并将您的解析器调整为将任何空字符串变量设置为None:
if not variable:
variable = None
此前的SO问题可能也有帮助: I'm looking for a constraint to prevent the insert of an empty string in MySQL