Python 访问家长&x27;来自儿童模型的关系

Python 访问家长&x27;来自儿童模型的关系,python,django,inheritance,Python,Django,Inheritance,在一个Django项目中,我想基本上代表一个城市环境:一对建筑物和街道,可以在它们之间移动。为了实现这一点,我选择了表示法:每个节点表示一个房间或一条道路,每个边表示在两个节点之间移动的可能性 因此,我有了第一个应用程序graphs,其中包含以下Graph,节点和边缘模型: class Graph(models.Model): label = models.CharField(max_length=200) class Node(models.Model): graph = m

在一个Django项目中,我想基本上代表一个城市环境:一对建筑物和街道,可以在它们之间移动。为了实现这一点,我选择了表示法:每个节点表示一个房间或一条道路,每个边表示在两个节点之间移动的可能性

因此,我有了第一个应用程序
graphs
,其中包含以下
Graph
节点
边缘
模型:

class Graph(models.Model):
    label = models.CharField(max_length=200)

class Node(models.Model):
    graph = models.ForeignKey(Graph)

    # some methods

class Edge(models.Model):
    node_a = models.ForeignKey(Node, related_name='node_a')
    node_b = models.ForeignKey(Node, related_name='node_b')

    # some methods
在这些抽象概念的基础上,我想构建更具体的概念:图形实际上是一张地图,一个节点可以在地图中定义坐标来表示街道或房间,一条边表示两个节点之间的路径。在第二个
cities
应用程序中,我基本上有:

from graphs.models import *

class Map(Graph):
    # ...

class Element(Node):
    # ...

class Path(Edge):
    # ...
这就是继承的障碍所在,我正迷失在Django模型关系中

1/我想在
元素
地图
之间丰富现有的
外键
,以添加坐标(x,y),因为元素在地图空间中有一个特定的位置。但我不确定这是否可能。我是否应该定义一个新的关系(如)?就建筑而言,这不是很糟糕吗?如果要这样做,我如何向这个关系中添加额外的数据(即坐标)?(我知道,我不需要m2m关系,这正是我需要的)

2/通过继承,
元素
(它是
节点
)属于
映射
(它是
图形
),但显然我不能这样做:

>>> map = Map.objects.get(id=1)  # suppose it exists and has a few Elements
>>> map_elements = map.element_set().all()

AttributeError: 'Map' object has no attribute 'element_set'
我有没有办法告诉Django使用
映射
的父节点集查找其元素


或者也许我走错了路,应该放弃这个继承的想法?我非常喜欢它,因为它允许我在不同的应用程序中保留与图形操作相关的所有逻辑。

以下是我将使用的方法,它可以真实地描述任何连接或断开连接的图形集合。设置的唯一问题是,没有任何东西可以阻止您连接来自不同图形的两个节点,这应该是一个错误

class Graph(models.Model):
    label = models.CharField(max_length=200)

class Node(models.Model):
    graph = models.ForeignKey(Graph)
    x = models.IntegerField()
    y = models.IntegerField()
    neighbors = models.ManyToMayField('self')
您不需要实际的边模型,除非您还试图描述方向图。在这种情况下:

class Graph(models.Model):
    label = models.CharField(max_length=200)

class Node(models.Model):
    graph = models.ForeignKey(Graph)
    x = models.IntegerField()
    y = models.IntegerField()

class Edge(models.Model):
    start = models.ForeignKey(Node, related_name='start_node_set')
    end = models.ForeignKey(Node, related_name='end_node_set')
你是对的,在这种情况下,忘记继承,这是一个非常错误的地方使用它。
此外,如果您想在实际地图上可视化图形,建议使用谷歌地图和GeoDjango。但这是一个单独的主题:)

我当前的假设:我必须在
映射
元素
之间重新定义FK,可能是一个中间
位置
模型,持有坐标…你需要“graphs”模型类做什么?我主要使用它来放置
计数节点/边等方法,这也是我给渲染器的对象,以获得它的表示。我的意思是:除了由
映射
元素
路径
继承之外,这些模型类是否有具体的用例(此时无法满足您的需要)?你的“渲染器”不应该关心具体的类型,只要你传递的实现了所需的接口……然后就放弃整个“图形”的东西,直接在你的真实模型中实现你所需要的。如果您后来发现可以在其他地方重用部分实现,那么是时候考虑一下了(顺便说一句,Python支持多重继承,因此您可以考虑到“mixin”类的行为)。非常感谢您花时间阅读并回答这一问题。我一直在探索您正在谈论的m2m解决方案(这是一本很好的读物:),但后来又回到了一个更简单的实现。我想我会放弃继承的狂热,让
graph
应用程序单独运行。