正在对ManyToManyField的列进行过滤?

问题描述 投票:0回答:1

我有这个(为讨论而简化)的数据模型,我似乎无法过滤多对多表的字段;下面的属性导致“相关字段的查找无效:​​人”:

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基础表的列进行显式过滤-我尝试使用的另一个过滤器看起来像travellers__person__idx__lt = self .idx。

这里是此联接表的架构(它确实具有预期的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 | 
django manytomanyfield
1个回答
0
投票

在此示例中,mungee_trips查询似乎仅返回该人员的行程(因此是多余的),因此您只需直接访问该字段-self.traveler_trips


为了访问filter中的反向关系,django使用related_query_name值。是的,如果未指定,则与related_name相同。

在这种情况下,在过滤器中,travelers指向Person模型,Person没有字段person。您可以使用[.filter(traveler=self)或按Person上的另一个字段(即,如果.filter(traveler__name="John")具有Person字段,则为name)进行过滤。


此外,由于此方法返回QuerySet,因此您可以考虑将其定义为custom manager

© www.soinside.com 2019 - 2024. All rights reserved.