Possible Duplicate:
Polymorphism in Django models
我有一个约束抽象基本模型,它有一个组的外键。多个模型继承自 Constraint,以各种不同的方式表现。这是我所拥有的(非常简化的)版本:
class Constraint(models.Model):
group = models.ForeignKey(Group)
def get_constraint_type(self):
return 'Base'
class meta:
abstract = True
class UserConstraint(Constraint):
user = models.ForeignKey(User)
def get_constraint_type(self):
return 'User'
class ProjectConstraint(Constraint):
project = models.ForeignKey(Project)
def get_constraint_type(self):
return 'Project'
对于给定的组,我需要能够提供指向它的约束模型实例列表。
例如如果我这样做
group = ...
constraints = group.constraint_set.all()
for c in constraints:
print c.get_constrait_type()
现在,它会多次打印“Base”,而不是“User”、“Project”、“User”等。
一个真正的 hacky 解决方案是在基类中实现这样的函数:
def get_child(self):
try:
return self.usercontraint
except UserConstraint.DoesNotExist:
pass
try:
return self.projectcontraint
except ProjectConstraint.DoesNotExist:
pass
# etc...
但这看起来真的很糟糕。有更好的解决方案吗?
最佳答案
那么,您的意思是您有 Group 模型的实例,并且您希望有与 UserConstraint 或 ProjectConstraint 相关的查询集吗?
有解决方案可以通过ForeignKey 字段中适当的lated_name
参数来实现此目的。详情见docs .
我认为你应该像这样定义约束模型:
class Constraint(models.Model):
group = models.ForeignKey(Group, related_name="%(class)s_set")
def get_constraint_type(self):
return 'Base'
class Meta:
abstract = True
并像这样使用它:
user_constraints = group.userconstraint_set.all()
project_constraints = group.projectconstraint_set.all()
编辑:
我已将 lated_name
从 "%(class)s"
更改为 "%(class)s_set"
。之前的值不起作用,我不知道为什么。
关于python - Django - 来自抽象基类的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483854/