Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中查询反向外键属性?_Django_Postgresql_Django Queryset - Fatal编程技术网

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

如何在Django中查询反向外键属性?,django,postgresql,django-queryset,Django,Postgresql,Django Queryset,我们正在使用Django 1.4.12和PostgreSQL构建酒店网站。我们有酒店,每个酒店都有房间,每个房间都有客人(客人有房间的外键,还有酒店的房间)。客人从房间退房后,他的出发日期设置为现在,如果他在房间里,则没有。我想选择有客人的房间和没有客人的房间,但我不能使用“guests\uu isnull”,因为客人退房后仍与房间保持连接。当客人的名字包含关键字时,我还需要搜索房间,但前提是他们在房间里。如果房间中至少有一位客人的姓名匹配,我希望选择该房间。但如果该客人退房,则无法选择房间 直

我们正在使用Django 1.4.12和PostgreSQL构建酒店网站。我们有酒店,每个酒店都有房间,每个房间都有客人(客人有房间的外键,还有酒店的房间)。客人从房间退房后,他的
出发日期设置为现在,如果他在房间里,则没有。我想选择有客人的房间和没有客人的房间,但我不能使用“
guests\uu isnull
”,因为客人退房后仍与房间保持连接。当客人的名字包含关键字时,我还需要搜索房间,但前提是他们在房间里。如果房间中至少有一位客人的姓名匹配,我希望选择该房间。但如果该客人退房,则无法选择房间

直到几天前,客人退房后我们才把他们的房间搬走,但我们需要保留它以保存历史。我们的代码是这样的:

hotel.rooms.filter(
    Q(description__icontains=keyword) | 
    Q(identifier__icontains=keyword) | 
    (Q(guests__isnull=False) & Q(guests__name__icontains=keyword))
).distinct()
对于入住房间,我们添加了
.exclude(guests\uu isnull=True)
。但是现在我们保留房间,我们需要检查出发日期是否为空。我们现在怎么做?请记住,我们需要将关键字与房间内的客人匹配,而不是与不在房间内的客人匹配。我们还需要计算有客人的房间总数和没有客人的房间总数

更新:我试图通过以下查询计算有客人的房间数:

hotel.rooms.filter(guests__isnull=False, guests__departure_date__isnull=True).count()
但它返回的数字不正确(14而不是10)。你知道如何解决这个问题吗

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


为什么排除正确而筛选器不正确?

好的,我找到了解决方案。似乎使用过滤器(…)时,房间会根据房间中的客人数量进行复制,但使用排除时,房间不会复制。有两种可能的解决方案来计算有客人的房间数量:

hotel.rooms.filter(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.filter(
    Q(description__icontains=keyword) |
    Q(identifier__icontains=keyword) |
    Q(guests__isnull=False, guests__departure_date__isnull=True, guests__name__icontains=keyword)
).distinct()

guests\uuu departuredate\uuu isnull=True
-给你当前在房间里的客人看文档:旁注:如果你的
guests
模型与你的
Room
模型有关系,你的数据建模是错误的。您应该有一个带有
房间
字段的
预订
(某种名称)模型,
预订
模型将包含
客人
的外键,因为
预订
是客人拥有的东西(可能有很多)。想想看;“客人”本身是否有“入住日期”或“退房日期”?当他们再次入住或在同一晚预订两个相邻的房间时会发生什么情况?@orokusaki谢谢,但如果客人再次入住,我们不需要保留以前的入住和退房日期。我们只对最后的入住和退房日期感兴趣。我们也不需要知道以前的房间,只需要知道每位客人的当前或最后一个房间。顺便说一句,如果客人再次登记,如果预订号码与以前不同,他可能会使用不同的客人对象进行注册。
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()