在多对多字段的列上过滤?



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

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.


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

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


此外,由于此方法返回 QuerySet,因此可以考虑将其定义为自定义管理器。

相关内容

  • 没有找到相关文章

最新更新