python - Django - 来自抽象基类的外键

标签 python django inheritance model

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/

相关文章:

python - 访问 Python 字典元素

python - Django 做一个简单的 group by/count 语句

python - 如何实时更新 django 模板?

django - celery 3.1.5 中的线程

Java 泛型 : override method that differs in parameterized return type

Python/Selenium - 通过 xpath 查找元素 - 元素存在,但未找到

python - python中的打印有什么区别

python - 与多个 Python 脚本共享一个字典

Java : Is there a way to automatically cast a return value?

java - 模板方法需要在子构造函数中声明一个对象