在以下模型中,我将覆盖其save
方法以在遇到null时使用字段的默认值而不是null。
该方法有效,但是比较罗word。有没有更干净的方法可以达到相同的目的?
class Activity(models.Model):
date_added = models.DateTimeField(auto_now_add=True)
number = models.IntegerField(default=0)
athlete = models.ForeignKey(Athlete, on_delete=models.CASCADE, default=None)
start_date = models.DateTimeField(default=datetime.datetime.now)
name = models.TextField(default="Unassigned")
country = models.TextField(default="Unassigned")
link = models.TextField(default="Unassigned")
segment_efforts = models.TextField(default="Unassigned")
distance = models.FloatField(null=True)
average_speed = models.FloatField(null=True)
def save(self, *args, **kwargs):
# overriding model's save method to use default field value instead of null, when null is encountered in JSON
fields = self._meta.get_fields()
for field in fields:
field_value = getattr(self, field.name)
if field_value == None:
field_att = self.__class__._meta.get_field(field.name)
default_value = field_att.get_default()
field_value = setattr(self, field.name, default_value)
return super(Activity, self).save(*args, **kwargs)
答案 0 :(得分:1)
实际上,如果您设置null=False
,则在数据库中创建新条目时,它将不存储空值。如果您也有一个default
值,那么它应该保存您设置的默认值。
模型中唯一不符合上述条件的问题字段是distance
和average_speed
。请考虑为它们设置默认值,而不要将null
设置为True
。
有了这些更改,就不必覆盖save
函数。