Я настраиваю модель данных в django, используя наследование нескольких таблиц (MTI), например:
class Metric(models.Model):
account = models.ForeignKey(Account)
date = models.DateField()
value = models.FloatField()
calculation_in_progress = models.BooleanField()
type = models.CharField( max_length=20, choices= METRIC_TYPES ) # Appropriate?
def calculate(self):
# default calculation...
class WebMetric(Metric):
url = models.URLField()
def calculate(self):
# web-specific calculation...
class TextMetric(Metric):
text = models.TextField()
def calculate(self):
# text-specific calculation...
Мой инстинкт состоит в том, чтобы поместить поле 'type' в базовый класс, как показано здесь, чтобы я мог сказать, какому подклассу принадлежит любой объект Metric. Было бы немного хлопотно постоянно обновлять информацию, но это возможно. Но мне нужно сделать это? Есть ли способ, которым django обрабатывает это автоматически?
Когда я вызываю Metric.objects.all()
, каждый возвращаемый объект является экземпляром Metric
, а не подклассами. Поэтому, если я позвоню .calculate()
, я никогда не пойму поведение подкласса.
Я мог бы написать функцию в базовом классе, которая проверяет, могу ли я привести ее к любому из подтипов, таких как:
def determine_subtype(self):
try:
self.webmetric
return WebMetric
except WebMetric.DoesNotExist:
pass
# Repeat for every sub-class
но это похоже на кучу повторяющегося кода. И это также не то, что может быть включено в фильтр SELECT - работает только в пространстве Python.
Какой лучший способ справиться с этим?