首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django中查询反向外键属性?

如何在Django中查询反向外键属性?
EN

Stack Overflow用户
提问于 2014-05-28 14:23:45
回答 1查看 239关注 0票数 1

我们正在使用Django 1.4.12与PostgreSQL一起为酒店建立一个网站。我们有酒店,每家酒店都有客房,每间客房都有客人(客人有房间的外键,酒店的房间)。客人从房间退房后,他的departure_date设置为现在,如果他在房间里,那就不是。我想选择有客人的房间和没有客人的房间,但我不能使用"guests__isnull“,因为客人在退房后仍然与房间连接。我还需要搜索房间时,客人的名字包含一个关键字,但只有当他们在房间。如果房间里至少有一位名字匹配的客人,我想要选择这个房间。但如果这位客人退房了,房间就不能选了。

直到几天前,我们离开了客人的房间,但我们需要保留它,以保存历史。我们的代码是这样的:

代码语言:javascript
复制
hotel.rooms.filter(
    Q(description__icontains=keyword) | 
    Q(identifier__icontains=keyword) | 
    (Q(guests__isnull=False) & Q(guests__name__icontains=keyword))
).distinct()

对于入住的房间,我们增加了.exclude(guests__isnull=True)。但是现在我们保留这个房间,我们需要检查departure_date是否为空。我们现在该怎么做?请记住,我们需要匹配关键字的客人在房间里,但不是与客人谁不在房间。我们还需要计算有客人的房间总数和没有客人的房间总数。

Update:我尝试使用以下查询计算有客人的房间数:

代码语言:javascript
复制
hotel.rooms.filter(guests__isnull=False, guests__departure_date__isnull=True).count()

但是它返回一个不正确的数字(14而不是10)。你知道如何修复查询吗?

顺便说一下,这个查询返回正确的没有客人的房间数(9个房间):

代码语言:javascript
复制
hotel.rooms.exclude(guests__isnull=False, guests__departure_date__isnull=True).count()

为什么排除正确,过滤器不正确?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-29 08:34:33

好吧,我找到了解决办法。看来,使用过滤器(.),房间按房间内的客人人数重复,但不包括在内。有两种可能的解决方案来计算有客人的房间数:

代码语言:javascript
复制
hotel.rooms.filter(guests__isnull=False, guests__departure_date__isnull=True).distinct().count()

或者:

代码语言:javascript
复制
hotel.rooms.exclude(~Q(guests__isnull=False, guests__departure_date__isnull=True)).distinct().count()

要计算没有客人的房间数:

代码语言:javascript
复制
hotel.rooms.exclude(guests__isnull=False, guests__departure_date__isnull=True).distinct().count()

或者:

代码语言:javascript
复制
hotel.rooms.exclude(Q(guests__isnull=False, guests__departure_date__isnull=True)).distinct().count()

以及搜查室:

代码语言:javascript
复制
hotel.rooms.filter(
    Q(description__icontains=keyword) |
    Q(identifier__icontains=keyword) |
    Q(guests__isnull=False, guests__departure_date__isnull=True, guests__name__icontains=keyword)
).distinct()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23914333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档