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。
答案 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="")