barciewicz
barciewicz

Reputation: 3813

Refactoring custom save method for a model

In the following model, I am overriding its save method to use field's default value instead of null whenever null is encountered.

The method works, but is wordy. Is there a cleaner way of achieving the same?

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)

Upvotes: 0

Views: 40

Answers (1)

David Duran
David Duran

Reputation: 1826

Actually, if you set null=False, when you create a new entry in your database, it will not store null values. If you also have a default value, then it should save the default value you have set.

The only problematic fields in your model that do not follow the above are distance and average_speed. Please consider setting a default value for them and not setting null to True.

With these changes, it is not necessary to override the save function.

Upvotes: 1

Related Questions