让我们说,举个例子,我有几个模型如下:
class People(models.Model):
name = models.CharField()
class Job(models.Model):
salary = models.IntegerField()
employee = models.ForeignKey(People)
class Meta:
abstract : True
class Artist(Job):
# pass
class Vet(Job):
# pass
class Doctor(Job):
# pass
class Meta:
abstract : True
class Surgeon(Doctor):
# pass
现在,让我们说,我想让一个人完成所有工作。
我想做点什么
Mister_Jack = People.objects.get(pk=1)
jobs = Mister_Jack.job_set.all()
但它不起作用,因为Job是抽象的,并且“job_set”关系不存在。有一个“artist_set”,一个“surgeon_set”等。但我不想列出所有可能的工作。
最好的方法是什么?
注意:人与人工作模型只是一个例子来说明pb。
答案 0 :(得分:2)
您必须了解抽象模型的工作原理。预期用例是将子类的公共字段保存在一个位置。抽象模型类没有相应的数据库表。
这意味着Django无法在People
和Job
之间建立任何关系,因为这种关系在现实中并不存在。其他3个子类型模型存在于数据库中,但它们之间没有链接,因此Django无法帮助您解决这个问题。
为了获得所有可能的工作,Django无论如何都必须对每个表进行单独的查询。
您需要更改Job
模型不是抽象的,或者加入模型并使用一些type
字段来区分它们。根据我的经验,我发现模型继承非常繁琐,并且经常决定只使用一个更大的表,代价是一些字段总是空的。