Django CharField没有默认为空字符串

时间:2015-03-30 17:59:55

标签: django

Django文档说:

  

避免在基于字符串的字段(如CharField和)上使用null   TextField,因为空字符串值将始终存储为空   字符串,而不是NULL。

所以我设置了我的模型

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, )

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在您粘贴的引用文字中,稍后声明:

  

如果您希望在表单中允许空值,则还需要设置blank = True,因为null参数仅影响数据库存储(请参阅空白)。

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

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