重构模型的自定义保存方法

时间:2018-11-30 18:07:58

标签: python django

在以下模型中,我将覆盖其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)

1 个答案:

答案 0 :(得分:1)

实际上,如果您设置null=False,则在数据库中创建新条目时,它将不存储空值。如果您也有一个default值,那么它应该保存您设置的默认值。

模型中唯一不符合上述条件的问题字段是distanceaverage_speed。请考虑为它们设置默认值,而不要将null设置为True

有了这些更改,就不必覆盖save函数。