django - 我们如何在 Django 中查询反向外键属性?

标签 django postgresql django-queryset

我们正在使用 Django 1.4.12 和 PostgreSQL 来构建一个酒店网站。我们有酒店,每家酒店都有房间,每个房间都有客人(客人有一个房间的外键,还有一个房间到酒店)。客人从房间退房后,他的 departure_date 设置为现在,如果他在房间,则为 none。我想选择有客人的房间和没有客人的房间,但我不能使用“guests__isnull”,因为客人在退房后仍与房间保持连接。当客人的名字包含关键字时,我还需要搜索房间,但前提是他们在房间里。如果房间中至少有一位名字匹配的客人,我希望选择房间。但是如果这个客人check out了,就不能选房了。

直到几天前,我们在客人退房后删除了他们的房间,但我们需要保留它以保存历史记录。我们的代码是这样的:

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 是否为空。我们现在该怎么做?请记住,我们需要将关键字与房间内的客人相匹配,而不是与不在房间内的客人相匹配。我们还需要统计有客人的房间总数和没有客人的房间总数。

更新:我尝试使用以下查询来计算有客人的房间数量:

hotel.rooms.filter(guests__isnull=False, guests__departure_date__isnull=True).count()

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

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

hotel.rooms.exclude(guests__isnull=False, guests__departure_date__isnull=True).count()

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

最佳答案

好的,我找到了解决方案。似乎使用 filter(...),房间会根据房间中的客人数量进行复制,但使用 exclude 则不会。有 2 种可能的解决方案来计算有客人的房间数量:

hotel.rooms.filter(guests__isnull=False, guests__departure_date__isnull=True).distinct().count()

或:

hotel.rooms.exclude(~Q(guests__isnull=False, guests__departure_date__isnull=True)).distinct().count()

统计没有客人的房间数:

hotel.rooms.exclude(guests__isnull=False, guests__departure_date__isnull=True).distinct().count()

或:

hotel.rooms.exclude(Q(guests__isnull=False, guests__departure_date__isnull=True)).distinct().count()

搜索房间:

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

关于django - 我们如何在 Django 中查询反向外键属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23914333/

相关文章:

python Django : pre-select dropdown of custom field

python - Pandas 正则表达式返回包含 U 或 UN 和数字的任何字符串

python - 为 Django 管理员扩展 base_site.html

sql - 选择表中不存在的 ID

sql - 如何使用 SQL 将文本附加到数据库中的重复条目

python - Django Query 根据最新外键时间戳获取对象并对它们进行排序

python - 指向函数不工作的 Django 模型变量

postgresql - 在 Postgres 中将重复数据存储为列?

django distinct 和 order_by

python - Django 查询过滤器中的参数 "name__icontains"和 "description__icontains"是什么意思?