Django Don';不允许在模型属性上使用空字符串
因此,我有一个具有以下属性的图书模型:Django Don';不允许在模型属性上使用空字符串,django,Django,因此,我有一个具有以下属性的图书模型: title = models.CharField(max_length=250) 在管理或模型表单中,这将不允许保存空字符串,因为默认情况下blank=False。但在我的例子中,我解析xml并以这种方式创建模型,所以我根本不使用任何表单 所以我想知道我是否可以设置一个不允许空字符串的约束,或者我是否必须编写模型字段或调整解析器?MySQL对约束的支持有限,因此您必须使用触发器或调整解析器 假设您也可以不使用NULL作为字段值,则可以将模型字段设置为NU
title = models.CharField(max_length=250)
在管理或模型表单中,这将不允许保存空字符串,因为默认情况下blank=False。但在我的例子中,我解析xml并以这种方式创建模型,所以我根本不使用任何表单
所以我想知道我是否可以设置一个不允许空字符串的约束,或者我是否必须编写模型字段或调整解析器?MySQL对约束的支持有限,因此您必须使用触发器或调整解析器 假设您也可以不使用NULL作为字段值,则可以将模型字段设置为
NULL=False
(NULL纯粹与数据库相关,而blank与验证相关),并调整解析器将空字符串的任何变量设置为None:
if not variable:
variable = None
前一个SO问题也可能有帮助:
您仍然可以使用表单验证数据并创建模型对象,因为ModelForm返回它创建的对象。我在从.xls文件批量更新模型时使用了这种方法,效果非常好 以这种方式使用表单还可以让您有机会记录出错的错误,启动其他进程,或者您想要的任何东西 它还使您不必手动编辑数据库,如果字符串为空,表单还可以插入默认值
希望这对您有所帮助。Django模型的默认值是
blank=False
,适用于表单验证,以及null=False
,这意味着数据库不能包含null
。如果不使用表单实例化模型实例,这两种方法都不会阻止空字符串保存在数据库中
在不使用表单的情况下(例如,如果您试图使用create
或get\u或\u create
实例化类),执行此操作的一个好方法是:
在您的情况下,您可能也可以将验证放入
save
函数中。覆盖clean
方法并在save方法中调用full\u clean
的优点是ValidationError
将添加到表单的非\u字段\u errors
您仍然可以使用表单验证数据并创建模型对象。我在解析.xls文件时使用了这种方法,而且效果很好。使用表单还可以让您有机会记录错误。这是一个很好的提示,您应该从中做出回答。谢谢。我加上它作为答案。
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)