2015-06-21 76 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() 
相關問題