Django ManyToMany继承

时间:2013-07-20 16:59:44

标签: django inheritance many-to-many

我已经检查了很多SO文章,我不相信有任何方法可以完成我想做的事情,但在我放弃Django之前,我想表达问题本身,看看我是否遗漏了什么。 / p>

我正在实现一个图形(节点,边),它可以包含基类型的子类。也就是说,边可以将基类连接到子类,或者将子类连接到子类等。 。 。我希望能够拉出给定对象的所有边,找到这些边指向的对象,并在这些终端对象上调用一些函数。我希望我能以多态方式调用该函数,但我无法找到实现这一目标的方法。

class Node(models.Model):
    ...
    def dosomething():

class SpecialNode(Node):
    ...
    def dosomething():

class Edge(models.Model):
    #yes, related_name is weird, but this seems to be what makes sense
    source = models.ForeignKey(Node, related_name='targets')
    target = models.ForeignKey(Node, related_name='sources')

通过这种结构,我可以做到:

sourceedges = node.sources.all()
for sourceedge in sourceedges:
    sourceedge.source.dosomething()

但是,“dosomething”函数总是在Node对象上调用,即使source实际上是一个SpecialNode对象。

我已尝试使用django_polymorphic执行此操作,但我不相信这会通过Edge对象支持M2M继承(这在我的应用中是出于其他原因而需要)。

我尝试使用contenttypes,但我认为每个类只允许一个通用关系。换句话说,Edge中不能有两个不同的泛型关系。

我想我可以建立一个名为Endpoint的对象,它只有一个通用关系,然后将Edge对象链接到它就像这样:

class Endpoint(models.Model)
    ...
    content_object = generic.GenericForeignKey(...)

class Edge(models.Model)
    source = models.ForeignKey(Endpoint, related_name='targets')
    target = models.ForeignKey(Endpoint, related_name='sources')

但是这在我的模型中引入了另一层次的间接性,我开始觉得框架是在编码我而不是相反:)

无论如何,如果有人找到了完成这个特定用例的方法,请告诉我。比我上面建议的更好的方式是受欢迎的,因为我现在喜欢很多东西,我开始使用Django。

由于

0 个答案:

没有答案