如何通过相关模型的 primary_key 将包含外键对象的查询集排序到模型
How to order a Queryset containing foreign key objects to a model by related model's primary_key
我想知道在一个非常简单的案例中实现此目的的方法。
我有带有 Facilities 的 Room 对象,因为它是外键。考虑四个房间(R1 到 R4),每个房间只连接到一个设施对象。
假设房间的相关映射是R1->F4,R2->F1,R3->F2,R4->F3
(R1 是第一个房间,F1 是连接到第一个房间的设施等等)
(所有F1-F4甚至可以是同一个设施对象)
在过滤 Room 对象时查询数据库 returns < R1, R2, R3, R4 >
(所有房间 return 由 room_id 订购)
所以,我想知道如何通过过滤 Facilities 对象来查询数据库 return < F4, F1, F2, F3 >
如果所有房间都连接到一个设施 F1,我希望最终结果是
< F1, F1, F1, F1>
我的models.py文件
class Room(Base):
facilities = models.ForeignKey(Facilities, on_delete=models.CASCADE)
room_type = models.ForeignKey(RoomTypes, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
offer = models.DecimalField(max_digits=5, decimal_places=2, default=0.0)
description = models.TextField(null=True, blank=True)
# Facilities object that describes what all facilities are present in a room
class Facilities(Base):
storage = models.BooleanField(default=True)
locker = models.BooleanField(default=True)
tv = models.BooleanField(default=True)
bathroom = models.BooleanField(default=True)
iron_table = models.BooleanField(default=True)
balcony = models.BooleanField(default=True)
garden = models.BooleanField(default=True)
wifi = models.BooleanField(default=True)
refrigerator = models.BooleanField(default=True)
ac = models.BooleanField(default=False)
cctv = models.BooleanField(default=False)
bed = models.BooleanField(default=True)
我想 select 所有设施(至少连接到一个房间)并按 room_id 订购。我希望拥有与房间数量相同的设施 returned。
数据库是 MySql,我正在使用 Django-ORM 来处理所有查询。
换句话说,我想执行SQL加入操作b/w房间和设施,公共列是连接房间和设施的两个表中的设施ID。然后我想订购设施的结果,首先显示较低的房间 ID。
我会在房间的设施字段中添加 related_name
class Room(Base):
facilities = models.ForeignKey(Facilities, on_delete=models.CASCADE, related_name="rooms")
您可以通过以下方式获得按房间订购的所有设施:
Facilities.objects.order_by("rooms")
如果未设置 related_name,我不确定语法是什么。
我想知道在一个非常简单的案例中实现此目的的方法。 我有带有 Facilities 的 Room 对象,因为它是外键。考虑四个房间(R1 到 R4),每个房间只连接到一个设施对象。
假设房间的相关映射是R1->F4,R2->F1,R3->F2,R4->F3 (R1 是第一个房间,F1 是连接到第一个房间的设施等等) (所有F1-F4甚至可以是同一个设施对象)
在过滤 Room 对象时查询数据库 returns < R1, R2, R3, R4 > (所有房间 return 由 room_id 订购)
所以,我想知道如何通过过滤 Facilities 对象来查询数据库 return < F4, F1, F2, F3 > 如果所有房间都连接到一个设施 F1,我希望最终结果是 < F1, F1, F1, F1>
我的models.py文件
class Room(Base):
facilities = models.ForeignKey(Facilities, on_delete=models.CASCADE)
room_type = models.ForeignKey(RoomTypes, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
offer = models.DecimalField(max_digits=5, decimal_places=2, default=0.0)
description = models.TextField(null=True, blank=True)
# Facilities object that describes what all facilities are present in a room
class Facilities(Base):
storage = models.BooleanField(default=True)
locker = models.BooleanField(default=True)
tv = models.BooleanField(default=True)
bathroom = models.BooleanField(default=True)
iron_table = models.BooleanField(default=True)
balcony = models.BooleanField(default=True)
garden = models.BooleanField(default=True)
wifi = models.BooleanField(default=True)
refrigerator = models.BooleanField(default=True)
ac = models.BooleanField(default=False)
cctv = models.BooleanField(default=False)
bed = models.BooleanField(default=True)
我想 select 所有设施(至少连接到一个房间)并按 room_id 订购。我希望拥有与房间数量相同的设施 returned。 数据库是 MySql,我正在使用 Django-ORM 来处理所有查询。
换句话说,我想执行SQL加入操作b/w房间和设施,公共列是连接房间和设施的两个表中的设施ID。然后我想订购设施的结果,首先显示较低的房间 ID。
我会在房间的设施字段中添加 related_name
class Room(Base):
facilities = models.ForeignKey(Facilities, on_delete=models.CASCADE, related_name="rooms")
您可以通过以下方式获得按房间订购的所有设施:
Facilities.objects.order_by("rooms")
如果未设置 related_name,我不确定语法是什么。