我有这个(简化讨论(数据模型,我似乎无法过滤多对多表的字段;下面的属性导致"相关字段得到无效的查找:人":
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 基础表的列 - 我尝试使用的另一个过滤器看起来像 travelers__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 中的反向关系,django 使用related_query_name值。是的,如果未指定,则与related_name
相同。
在这种情况下,在过滤器中travelers
指向Person
模型,Person
没有字段person
。您可以使用.filter(travelers=self)
或按Person
上的另一个字段进行过滤,即.filter(travelers__name="John")
Person
是否有name
字段。
此外,由于此方法返回 QuerySet,因此可以考虑将其定义为自定义管理器。