正在对ManyToManyField的列进行过滤?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正在对ManyToManyField的列进行过滤?相关的知识,希望对你有一定的参考价值。

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

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 | 
答案

在此示例中,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

以上是关于正在对ManyToManyField的列进行过滤?的主要内容,如果未能解决你的问题,请参考以下文章

仅当一个查询中存在关系时才过滤 ManyToManyField

过滤不在选择中的列值

过滤 ManyToManyField 中间表字段

如何过滤 Django ModelForm 中的 ManyToManyField 选项?

ManyToManyField对象上的Django可变数量的过滤器?

如何在 Django 中使用 through 过滤 ManytoManyField?