不允许在模型属性上使用空字符串

时间:2011-07-25 16:12:00

标签: django

所以我有一个具有以下属性的书模型:

title = models.CharField(max_length=250)

在管理员或模型表单中,这将不允许保存空字符串,因为默认情况下为blank = False。但在我的情况下,我正在解析xml并以这种方式创建模型,所以我根本不使用任何形式。

所以我想知道我可以设置一个不允许空字符串的约束,还是我必须编写模型字段或调整我的解析器?

3 个答案:

答案 0 :(得分:6)

您仍然可以使用表单来验证数据并创建模型对象,因为ModelForm会返回它创建的对象。我在对.xls文件中的模型进行批量更新时使用了这种方法,效果很好。

以这种方式使用表单还可以让您有机会记录出错的错误,启动其他进程或任何您喜欢的内容。

它还可以减轻您手动编辑数据库的负担,如果字符串为空,表单也可以插入默认值。

希望能帮到你。

答案 1 :(得分:4)

Django模型的默认值为blank=False,适用于表单验证,null=False,表示数据库不能包含NULL。如果您不使用表单来实例化模型实例,这些都不会阻止空字符串保存在您的数据库中。

在不使用表单的情况下执行此操作的好方法(例如,如果您尝试使用createget_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