>问题
给定一个带有字段的模型,birthplace
,其中默认值设置为空字符串:
class Person(models.Model):
person_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=256, blank=False)
birthplace = models.CharField(max_length=256, blank=True, default="")
。以及使用以下代码生成实例的一些代码:
kwargs = {
"name": json_data.get("name"),
"birthplace": json_data.get("birthPlace"),
}
person = models.Person(**kwargs)
person.save()
我希望 Django 能够替换传入json_data.get("birthPlace")
评估为 None
的默认值。但我得到:
完整性错误:(1048,"列'出生地'不能为空"(
潜在解决方案
我可以使用json_data.get("birthPlace", "")
,但这似乎非常不干燥,特别是因为"默认"值现在在两个或更多地方定义。
或者,我可以使用类似的东西:
json_data.get("birthPlace", Person._meta.get_field_by_name('field_name').default)
。但它仍然感觉非常复杂(对于 Python(。
我是否错过了一种更简单、更优雅的方式来解决这个特定问题?
您的使用建议
Person._meta.get_field_by_name('birthplace').default
对我来说似乎还可以。
另一种方法是检查birthplace
是否None
,并且只在指定时才将其包含在 kwargs 中。当 birthplace
不包含在 kwargs 中时,Django 将使用默认值。
kwargs = {
"name": json_data.get("name"),
}
birthplace = json_data.get("birthPlace")
if birthplace is not None:
kwargs['birthplace'] = birthplace
person = models.Person(**kwargs)
它有点冗长,但您没有默认值的重复。
通过传递json_data.get("birthPlace")
强制 None 值(如果未设置出生地点或 None(
我会选择以下其中一项
1(
birthplace = models.CharField(max_length=256, blank=True, null=True) # null=True instead of default (which makes more sence)
2(
"birthplace": json_data.get("birthPlace") or "",