django - 为关系排序
问题描述
给定以下 Django 模型:
class Room(models.Model):
name = models.CharField(max_length=20)
class Beacon(models.Model):
room = models.ForeignKey(Room)
uuid = models.UUIDField(default=uuid.uuid4)
major = models.PostiveIntegerField(max_value=65536)
minor = models.PositiveIntegerField(max_value=65536)
该Beacon
模型是与房间的蓝牙信标关系。
我想选择与给定uuid, major, minor
组合匹配的所有房间。
问题是,我想通过离我最近的信标订购房间。因此,我需要能够为每个信标动态分配一个值,然后按它排序。
这对 Django ORM 可行吗?在 Django 1.8 中?
注意- 我会事先知道信标的顺序,我将使用它们在查询字符串中传递的顺序。因此传递的第一个信标(uuid、major、minor)应该与 Room QuerySet 返回的第一个房间匹配
我正在设想这样的事情,尽管我知道这行不通:
beacon_order = [
beacon1 = 1,
beacon0 = 2,
beacon3 = 3,
]
queryset = Room.objects.annotate(beacon_order=beacon_order).\
order_by('beacon_order')
解决方案
如果您已经知道信标的顺序,则无需在 QuerySet 本身内进行排序。取一个名为 的有序列表beacon_list
,它按顺序包含信标的主键,例如,索引 0 处的项目是最近的信标的主键,索引 1 的项目是第二近的信标的 PK,等等。然后使用列表推导:
ordered_rooms = [Room.objects.get(pk=x) for x in beacon_list]
您也不必使用 PK,您可以使用在数据库中标识给定对象的任何内容,例如name
字段。
推荐阅读
- scala - 是否可以使用 ScalaMock 模拟/存根方法?
- c++ - 在 C++ 中访问函数中的全局变量
- css - React Material-UI 模态宽度不起作用
- reactjs - 传递菜单项并使用地图我也想在 reactjs 中使用默认道具
- java - 如何将 IntStream 映射到 Runnables 列表?
- gradle - 如何在 Gradle 7 的自定义任务中使用 @Delegate?
- python - 如何从 python 中的字符串中只删除最后一个括号?
- python - 在 Plotly 中更新下拉菜单后保持数据颜色
- mysql - 如何根据 MySQL 中的值范围获取表中的特定值?
- google-cloud-platform - 使用 Ops Agent 监控 Google Cloud 中的 Apache2