过滤 ManyToManyField 列?
Filtering on column of ManyToManyField?
我有这个(为讨论而简化的)数据模型,我似乎无法过滤多对多的字段 table;下面的 属性 结果是 "Related Field got invalid lookup: person":
class Person(Model):
traveler_trips = ManyToManyField('Trip', related_name='travelers')
@property
def mungee_trips(self):
return Trip.objects.filter(travelers__person=self).all()
同样,这是我正在尝试做的事情的一个简化示例;我意识到 person.traveler_trips 会给我与此 属性 相同的结果,我想知道我需要做什么才能显式过滤 ManyToManyField 的基础 table 的列 - 我的另一个过滤器我正在尝试使用看起来像 travelers__person__idx__lt=self.idx.
这是此联接的架构 table(它确实具有预期的 person_id 列):
Column | Type | Collation | Nullable | Default
----------------+---------+-----------+----------+----------------------------------------------
id | integer | | not null | nextval('ms_traveler_trip_id_seq'::regclass)
person_id | integer | | not null |
trip_id | integer | | not null |
在这个例子中 mungee_trips
查询似乎 return 只是这个人的行程(因此是多余的),
所以您可以 直接访问该字段 - self.traveler_trips
.
为了访问 filter
中的反向关系,django 使用 related_query_name 值。是的,如果未指定,则与 related_name
.
相同
在这种情况下,过滤器 travelers
指向 Person
模型并且 Person
没有字段 person
。您可以使用 .filter(travelers=self)
或按 Person
上的另一个字段过滤,即 .filter(travelers__name="John")
如果 Person
有 name
字段。
此外,作为此方法的returns QuerySet,您可以考虑将其定义为custom manager。
我有这个(为讨论而简化的)数据模型,我似乎无法过滤多对多的字段 table;下面的 属性 结果是 "Related Field got invalid lookup: person":
class Person(Model):
traveler_trips = ManyToManyField('Trip', related_name='travelers')
@property
def mungee_trips(self):
return Trip.objects.filter(travelers__person=self).all()
同样,这是我正在尝试做的事情的一个简化示例;我意识到 person.traveler_trips 会给我与此 属性 相同的结果,我想知道我需要做什么才能显式过滤 ManyToManyField 的基础 table 的列 - 我的另一个过滤器我正在尝试使用看起来像 travelers__person__idx__lt=self.idx.
这是此联接的架构 table(它确实具有预期的 person_id 列):
Column | Type | Collation | Nullable | Default
----------------+---------+-----------+----------+----------------------------------------------
id | integer | | not null | nextval('ms_traveler_trip_id_seq'::regclass)
person_id | integer | | not null |
trip_id | integer | | not null |
在这个例子中 mungee_trips
查询似乎 return 只是这个人的行程(因此是多余的),
所以您可以 直接访问该字段 - self.traveler_trips
.
为了访问 filter
中的反向关系,django 使用 related_query_name 值。是的,如果未指定,则与 related_name
.
在这种情况下,过滤器 travelers
指向 Person
模型并且 Person
没有字段 person
。您可以使用 .filter(travelers=self)
或按 Person
上的另一个字段过滤,即 .filter(travelers__name="John")
如果 Person
有 name
字段。
此外,作为此方法的returns QuerySet,您可以考虑将其定义为custom manager。