我有一个这样的模型:
class Test(models.Model)
name = models.CharField(max_length=30, default="Unassigned")
每当在name
字段中使用None
保存该模型的实例时,我都希望使用"Unassigned"
保存该实例。但如果我这样做:
>>> test = Test()
>>>test.name = None
>>>test.save()
目前将失败
django.db.utils.IntegrityError:NOT NULL约束失败:explorer_api_test.name
,因为显然name
字段不允许为null(其中没有null=True
(。
但是如果我允许null,它将不会用默认的"Unassigned"
保存,而是用None
保存。
我该如何更改模型定义中的,以便每当它的实例试图用字段中的None
保存时,它都用默认字符串保存?在模型定义之外,我可以这样做:
>>>test = Test()
>>>test.name = None
>>>if test.name is None:
>>>...test.name = "Unassigned"
>>>test.save()
但我更喜欢在模型本身中包含这种逻辑。
您可以覆盖保存方法,如下所示:
class Test(models.Model):
field = models.CharField(max_length=30, default="Unassigned", null=True)
def save(self, *args, **kwargs):
if self.field == None:
field_att = self.__class__._meta.get_field('field')
default_value = field_att.get_default()
self.field = default_value
return super(Test, self).save(*args, **kwargs)