3
假设模型,如下所示:高效查询的Django的多对多额外字段通过
class GraphNode(models.Model):
name = models.CharField(...)
edges = models.ManyToManyField('self', through=Edge,
symmetrical=False)
class Edge(models.Model):
source = models.ForeignKey(GraphNode, ...)
destination = models.ForeignKey(GraphNode, ...)
edge_type = models.CharField(...)
我想回答这样的疑问:
与NODE_N一个节点开始,什么都是通过边缘型“foobar的”
连接的节点我希望能这样说:
results = GraphNode.objects.filter(source_set==node_n,
edges__edge_type='foobar')
但是,该语法不起作用(边缘跳过通过表,所以没有'edge_type'字段)。也不对:
results = GraphNode.objects.filter(edge__source=node_n,
edge__edge_type='foobar')
除非我删除了多对多字段声明!上面查询语法的工作点。
这是一个错误?有没有更好/最好的方法来查询ManyToMany通过表上的“额外的领域”,而不使用select_related?
我不知道我理解你说过的很多事情。什么是“通过参数”?而且,使用'self'和设置'through'参数来设置ManyToMany是完全正确的。我没有谈及限制边缘节点的数量,你为什么提到这一点? – slacy
限制节点的数量 - 好吧,这是隐含的要求,不是吗?对不起,我误解了结构。这是一个有趣的设置。我需要尝试在我的机器上运行它。 –