select 已过滤查询集上的相关和 Q 对象

select related and Q objects on already filtered queryset

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

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

然后,无论事情是否属实,我都会进一步过滤。

venuelist = venuelist.filter(venuetype__in=venuetypepklist)

根据我的理解 __in 是一个 OR 运算符而不是 AND

我有这样一种情况,如果某件事是真的,我需要进一步过滤,但我需要过滤场地对象的相关集。

我知道我们可以用相关的集合来做到这一点。但是我正在检查的东西在实际的场地对象中也可能是真的。

例子。我的场馆有全额买断容量选项 table。

我在场地的每个房间中也有容量选项。

如果场地完全买断容量值大于或等于用户输入容量或与场地相关的房间容量之一等于或大于用户输入的值。

我正在使用 Q 对象和 select 查询,但是我似乎没有做对,或者真的不知道我在做什么。

这是我目前对上述过滤器的了解

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))

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

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

假设您在 VenueRoom 之间有一个 ForeignKey 关系,即每个 Room 都有一个到 Venue 的外键:

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))