2015-06-21 46 views
3

在我的Django模型文件,我有:Django模型:如何结合来自两个foreignkey字段的反向访问集?

class Node(models.Model): 
    name = models.CharField(max_length=16) 

class Segment(models.Model): 
    start = models.ForeignKey(Node, related_name='start_segments') 
    end = models.ForeignKey(Node, related_name='end_segments') 

从Node对象,我想访问所有细分对象,要么开始或结束指向节点,从单一属性的名称,如:

node_x.segment_set 

然而,就我所见,这是不可能的。我只提供了两个不同的related_name-s,以避免出现其他错误。否则,我想创建一个结合两者的单个集合。

我可以创建一个实用程序方法,它将返回组合集。但是,它不适用于查询。在我的应用程序中,我经常需要考虑连接到节点的所有分段。

回答

1

要检索QuerySet,您可以利用Q对象(见Complex lookups with Q objects)的。通过访问property

from django.db import models 
from django.db.models import Q 

class Node(models.Model): 
    name = models.CharField(max_length=16) 

    @property 
    def segments(self): 
     return Segment.objects.filter(Q(start=self) | Q(end=self)) 

现在在你的代码,你可以检索段:

from django.db.models import Q 
results = Segment.objects.filter(Q(start=node_x) | Q(end=node_x)) 

访问更快速,你可以将其定义为property

In [1]: print node_x.segments # or print(node_x.segments) in Python 3 
Out[1]: [<Segment: Segment object>, <Segment: Segment object>, ...] 
1

我认为你应该要么使用

Segment.objects.filter(start=node_x) | Segment.objects.filter(end=node_x) 

node_x.start_segments.all() | node_x.end_segments.all() 
相关问题