Django模型:如何组合两个外键字段的反向访问集?

时间:2015-06-21 15:06:50

标签: python django

在我的django模型文件中,我有:

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,以避免抛出错误。否则,我想创建一个结合两者的单一集。

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

2 个答案:

答案 0 :(得分:1)

我认为你应该使用

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

node_x.start_segments.all() | node_x.end_segments.all()

答案 1 :(得分:1)

要检索QuerySet,您可以使用Q个对象(请参阅Complex lookups with Q objects)。

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

要更快地访问它,您可以将其定义为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))

现在,您可以在代码中访问property

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