0

问题

给定一个具有字段 的模型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. 但我得到:

IntegrityError:(1048,“列'出生地'不能为空”)

潜在的解决方案

我可以使用json_data.get("birthPlace", ""),但这似乎非常不干燥,特别是因为“默认”值现在在两个或更多地方定义。

或者,我可以使用类似的东西:

json_data.get("birthPlace",  Person._meta.get_field_by_name('field_name').default)

...但它仍然感觉非常复杂(对于 Python)。

我是否错过了一种更简单、更优雅的方式来解决这个特定问题?

4

2 回答 2

0

通过传递json_data.get("birthPlace")你强制无值(如果没有设置出生地或无)

我会选择以下之一

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 "",
于 2013-10-10T12:37:48.353 回答
0

您的使用建议

Person._meta.get_field_by_name('birthplace').default

对我来说似乎没问题。

另一种方法是检查是否birthplaceis 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)

这有点冗长,但您没有默认值的重复。

于 2013-10-10T12:49:06.180 回答