wxcoder
wxcoder

Reputation: 655

Django repetitive function in models

I have a group of model classes that all need the same function. Rather than define this function in every model class, is there a more concise way to do this?

class Archive(models.Model):
    source = models.CharField(max_length=100, blank=True, null=True)
    total_size = models.FloatField(blank=True, null=True)
    number_of_files = models.FloatField(blank=True, null=True)
    number_of_files_transferred = models.FloatField(blank=True, null=True)

    class Meta:
        db_table = 'archive'

    def as_dict(self):
    return {
        "source": self.source,
        "total_size": self.total_size,
        "number_of_files": self.number_of_files,
        "number_of_files_transferred": self.number_of_files_transferred
    }



class FullNightlyMetrics(models.Model):
    source = models.CharField(max_length=100, blank=True, null=True)
    total_size = models.FloatField(blank=True, null=True)
    number_of_files = models.FloatField(blank=True, null=True)
    number_of_files_transferred = models.FloatField(blank=True, null=True)

    class Meta:
        db_table = 'full_nightly_metrics'

    def as_dict(self):
    return {
        "source": self.source,
        "total_size": self.total_size,
        "number_of_files": self.number_of_files,
        "number_of_files_transferred": self.number_of_files_transferred
    }

Upvotes: 0

Views: 153

Answers (1)

Xiaoqi Chu
Xiaoqi Chu

Reputation: 1557

You could define functions in abstract base model, and extend this base model in other models. The documentation is here

In your code, it would be like

from django.db import models

class CommonInfo(models.Model):
    source = models.CharField(max_length=100, blank=True, null=True)
    total_size = models.FloatField(blank=True, null=True)
    number_of_files = models.FloatField(blank=True, null=True)
    number_of_files_transferred = models.FloatField(blank=True, null=True)

    def as_dict(self):
      return {
          "source": self.source,
          "total_size": self.total_size,
          "number_of_files": self.number_of_files,
          "number_of_files_transferred": self.number_of_files_transferred
      }


    class Meta:
        abstract = True



class Archive(CommonInfo):

    class Meta:
        db_table = 'archive'


class FullNightlyMetrics(CommonInfo):

    class Meta:
        db_table = 'full_nightly_metrics'

Just have a try. I am not sure whether there is any bug in the code. Hope that could help you.

Upvotes: 2

Related Questions