【发布时间】:2026-01-02 15:40:02
【问题描述】:
我正在使用多表继承 (MTI) 在 django 中设置数据模型,如下所示:
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...
我的直觉是在基类中放置一个“类型”字段,如此处所示,这样我就可以知道任何 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 空间中使用。
处理这个问题的最佳方法是什么?
【问题讨论】:
-
我不确定我是否理解您的问题...您的意思是说您希望在执行某些操作时能够识别“Metric”是“WebMetric”还是“TextMetric”在'Metric'上,例如:'a_metric_to_recognize = Metric.objects.get(pk=some_pk)' ???
标签: python django django-models