Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 Don';不允许在模型属性上使用空字符串_Django - Fatal编程技术网

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)