正在对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
如何过滤 Django ModelForm 中的 ManyToManyField 选项?