在 Django ORM 中自动替换默认值 None



>问题

给定一个带有字段的模型,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 "",

最新更新