0

我有一个我得到的查询集。然后根据我的软件中的某些事情是否属实,我会进一步过滤查询集。

venuelist = Venue.objects.filter(approved=True, online=True) # intial queryset

那么如果事情是真的,我会进一步过滤。

venuelist = venuelist.filter(venuetype__in=venuetypepklist)

据我了解__inOR运营商而不是AND

我有一种情况,如果某事属实,我需要进一步过滤,但我需要过滤场地对象的相关集。

我知道我们可以通过设置相关来做到这一点。但我正在检查的事情在实际场地对象中也可能是真的。

例子。我的场地表中有一个完全买断容量选项。

我在场地的每个房间都有容量选择。

如果场地完全买断容量值大于或等于用户输入容量或与场地相关的房间容量之一等于或大于用户输入值,则我的过滤器应该在场地未被过滤的情况下工作。

我正在使用 Q 对象并选择查询,但似乎我做得不对,或者真的不知道我在做什么。

到目前为止,这是我对上述过滤器的了解

seatedcapacity = self.request.query_params.get('seatedcapacity',None)
        if seatedcapacity is not None:
           venuelist.filter(Q(select_related('Room").seatedcapacity__gte=seatedcapacity) | Q(fullbuyoutseatedcapacity__gte=seatedcapacity))

但它不工作。我假设是因为语法相关的问题。所以我的问题是正确的语法是什么?

4

1 回答 1

0

select_related仅确保相关模型也从数据库中加载,您不能使用它们来过滤查询。您想为此使用 a Subquery,或者实际上Exists:这是文档

假设您在 and 之间有关系ForeignKey,即每个都有一个外键:VenueRoomRoomVenue

rooms = Room.objects.filter(venue=OuterRef('pk'), seatedcapacity__gte=seatedcapacity)
venueslist = venueslist.annotate(has_rooms_with_capacity=Exists(rooms))
venueslist = venueslist.filter(Q(has_rooms_with_capacity=True) | Q(fullbuyoutseatedcapacity__gte=seatedcapacity))
于 2018-04-04T21:26:52.780 回答