2015-03-30 161 views
1

Django的文档说:Django的CharField不默认为空字符串

避免使用空的基于字符串的领域,如CharField和 文本字段,因为空字符串值总是会被​​存储为空 字符串,而不是空值。

所以我建立我的模型像

class Address(models.Model): 
    address_num = models.TextField() 
    street_predir = models.CharField(max_length=2, default='') # optional 
    street_name = models.TextField() 
    street_suffix = models.CharField(max_length=4, default='') # optional 
    street_postdir = models.CharField(max_length=2, default='') # optional 

,然后创建一个缺少可选字段

raw_address = '1234 MAIN ST' 
# Run this through an address parser - this returns a dictionary of address components 
# Optional fields are returned as None if not present 
components = parser.parse(raw_address) 
address = Address(**components) 
address.save() 

的对象,但我得到的错误

null value in column "street_predir" violates not-null constraint 
DETAIL: Failing row contains (8633570, 2057 ANCHOR ST, 2057, null, ANCHOR, ST, null, null, null, ANCHOR ST, null, null,) 

任何人都可以解释为什么这不是默认为空的条纹NG? FWIW我正在使用Django 1.7.4和Postgres DB。

+0

不需要'default =''',你应该使用'blank = True'来允许表单中的空值。你可以发布traceback和可能的内容'from django.db import connection;打印(connection.queries)'? – knbk 2015-03-30 18:04:14

+0

您还可以发布创建对象的代码或任何自定义保存方法吗?某处,你明确地设置了'None'而不是一个空字符串。 – knbk 2015-03-30 18:17:45

回答

2
# Run this through an address parser - this returns a dictionary of address components 
# Optional fields are returned as None if not present 
components = parser.parse(raw_address) 

这明确地将值设置为None,其直接转换为NULL在数据库中。您应该删除具有价值None所有钥匙或'',而不是替代的价值:

components = {k: v for k, v in components.items() if v is not None} 

这将只设置非空的成分,和其他人将默认为一个空字符串,而不是NULL

0

在您粘贴引用的文字,有点后指出:

你还需要设置空白= true如果你希望允许在形式的空值,作为空参数只影响数据库存储(见空白)。

对于字符串,你应该使用blank=True

class MyModel(models.Model): 
    required_string = models.CharField() 
    optional_string = models.CharField(blank=True, default="") 
+0

虽然我没有使用任何表单或管理网站 - 这都是通过代码。我尝试设置'blank = True',我仍然得到相同的“违反非空约束”:/ – Rob 2015-03-30 18:13:34

+0

不要'忘记'null =真' – 2015-03-30 18:21:53

+0

@ C.B。 “避免在基于字符串的字段(如CharField和TextField)上使用null,如果基于字符串的字段的值为null = True,则意味着它对于”无数据“有两个可能的值:NULL和空字符串在大多数情况下,对于“无数据”有两个可能的值是多余的,Django约定是使用空字符串,而不是NULL。“ - https://docs.djangoproject.com/en/1.11/ref/models/fields/#null – wizpig64 2017-04-12 21:44:21