如何通过相关模型的 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,我不确定语法是什么。