我已经检查了很多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。
由于