过滤 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") 如果 Personname 字段。


此外,作为此方法的returns QuerySet,您可以考虑将其定义为custom manager