在我的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,以避免抛出错误。否则,我想创建一个结合两者的单一集。
我可以创建一个实用程序方法,它将返回组合集。但是,它不适用于查询。在我的应用程序中,我经常需要搜索连接到节点的所有段。
答案 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>, ...]