Django数据库:按相关数据库中最新对象的字段排序

2024-01-10

我在 django 中有两个数据库表:“Device”表用于存储实际设备,“DeviceTest”表用于存储每个设备的测试检查(对一个设备进行多次测试)。

class Device(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=20)
    serial_number = models.CharField(max_length=20)

    def __unicode__(self):
        return self.name + " - " + self.serial_number

class DeviceTest(models.Model):
    device = models.ForeignKey(Device)
    created_at = models.DateTimeField(auto_now_add=True)

    TEST_OK = '+'
    TEST_ERROR = '-'
    TEST_RESULT_CHOICES = (
        (TEST_OK, 'Test Success'),
        (TEST_ERROR, 'Test Error'),
    )
    status = models.CharField(max_length=1, choices=TEST_RESULT_CHOICES, default=TEST_ERROR)

    comment = models.TextField(blank=True, default="")
    tester = models.CharField(max_length=255)
    action = models.CharField(max_length=255)

    def __unicode__(self):
        return  self.device.name + " - " + \
                self.device.serial_number + " - " + \
                unicode(self.created_at) + " - " + \
                u"Result (" + self.status + ")"

我制作了 HTML 页面,其中包含所有设备的表格,格式为:

name | serial number | created_at | last_test_time | last_test_status | hyperlink to test table page

现在我想为用户提供所有排序的可能性。我已经通过“名称”、“序列号”和“created_at”字段的 GET 参数来完成此操作。现在我陷入了“last_test_time”和“last_test_status”字段。

这个问题可以用一些标准的 Django 函数来解决吗?就像是Device.objects.all().filter(???).order_by(???)


You can annotate https://docs.djangoproject.com/en/1.8/topics/db/aggregation/#joins-and-aggregates最新的查询集created_at time.

from django.db.models import Max

queryset = Device.objects.annotate(last_test_time=Max('devicetest__created_at'))

您可以访问last_test_time对于每个对象。

for obj in queryset
    print(obj.last_test_time)

您可以通过该字段对查询集进行排序

queryset = queryset.order_by('last_test_time')

但是,这只是部分答案,因为它不能帮助您获取该测试的状态。

您可以单独查找每个设备。

for device in queryset:
    device.latest_status = device.device_test.latest('created_at').status

如果设备数量较少,这还可以,但是这意味着每个设备需要一次查询,随着设备数量的增加,这并不理想。

您可以使用prefetch_related https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.prefetch_related在一个查询中获取所有相关的设备测试。 (下面的代码未经测试,我的语法可能略有错误)。

queryset = queryset.prefetch_related(Prefetch('devicetest', DeviceTest.objects.order_by('-created_at'))

然后,您可以通过第一个相关设备测试获取状态。

for obj in queryset:
    print obj.devicetest.all()[0].status 

请注意,这是低效的,因为您已经加载了所有相关项目,而不仅仅是最新的项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django数据库:按相关数据库中最新对象的字段排序 的相关文章

随机推荐

  • 如何将逗号分隔值拆分为列

    我有一张这样的桌子 Value String 1 Cleo Smith 我想将逗号分隔的字符串分成两列 Value Name Surname 1 Cleo Smith 我只需要两个固定的额外列 您的目的可以使用以下查询来解决 Select
  • Groovy 和 Java 支持矩阵 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 为了了解哪些 Java Groovy 组合可以工作 我正在寻找一个可以显示此信息的矩阵 两者都开启ht
  • redis.lpush 一些项目

    In my node js脚本我有一个字符串数组 我想要LPUSH将这些字符串放入 Redis 队列中 我试过 var redis require redis createClient redis lpush queue 1 2 3 这会导
  • MongoDB ObjectID 对于会话 ID 来说是安全的

    我正在为 Happstack 服务器制作一个会话系统 并使用 mongoDB 进行持久存储 我想知道 MongoDB ObjectID 用作会话 ID 是否安全 一般来说 MongoDB ObjectID 是全局唯一的 因此如果您担心冲突
  • 使用push_back将整数放入字符串中

    我正在尝试使用以下代码将整数放入字符串中 int x 42 string num bool negative false if x lt 0 negative true x x 1 while x gt 0 num push back x
  • 如何从 SwiftyJSON 创建对象

    我有一个代码 可以解析 JSON 的问题列表 并且可以获得每个属性 如何迭代整个文件并为每个问题创建一个对象 class ViewController UIViewController var hoge JSON override func
  • 加速 mysql 转储和导入 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AsyncWaitHandle.WaitOne 是否会阻塞 CLR 线程?或者它会创建一个 I/O 完成端口吗?

    我有这个问题 请问AsyncWaitHandle WaitOne阻塞CLR线程 或者它是否创建一个 I O 完成端口 例如 当我运行我的应用程序时 我启动一个任务 A 来初始化一些数据 当新请求到达时 我希望它们等到 A 完成 这样我就可以
  • 识别时间数据的差距

    EDIT 我找到了解决以下问题的方法 但是 它适用于小型数据集 但仍然会在大型数据集上创建错误输出 有人知道为什么吗 我找不到错误 这是代码 df continuous lt unlist lapply split df df ID fun
  • 如何在nginx中禁用http2

    due to this https openradar appspot com 26406397Safari 与 HTTP 2 和表单 POSTS 相关的问题 我想禁用通过 HTTP 2 提供一个网页的功能 所以我只是从相应的 nginx
  • 在函数式程序中获取 I/O

    所以我知道你不能在函数式程序中直接从用户那里获取输入 因为它显然不是纯粹的 但如果用户只有 4 个选项可供选择 这仍然适用吗 例如 如果你要求头发颜色 并且有四种选项可供选择 棕色 黑色 金色 红色 那么它是否仍然不纯 如果用户点击与他们的
  • 结合基于多个条件的观察结果

    目前我正在撰写硕士论文 但是 在多个条件下组合行时遇到一些问题 我在下面说明了我的问题和期望的结果 我希望你可以帮助我 这是我的数据集的示例 df lt data frame userID c 1 1 1 1 1 2 2 3 3 3 3 s
  • 什么是流处理中的背压?

    我开始学习 NodeJS 流似乎是人们经常使用的东西 在我读过的大多数文档中都提到了处理大文件时发生的 背压问题 但我还没有找到这个问题到底是什么的明确解释 我还读到使用管道可以帮助解决这个问题 但是管道到底如何解决背压问题呢 感谢您提前的
  • 向自定义验证器添加错误消息

    我有一个自定义验证器 我试图在失败时输出错误消息 但无法这样做 有人可以告诉我我是否在正确的地方执行此操作 class User lt ActiveRecord Base self table name user attr accessib
  • 当给定“const char *”作为第一个参数时,为什么 C 标准库函数“strchr”返回指向非常量的指针?

    使用 gcc g 成功编译给定的代码示例 没有错误strchr调用 这显然分配了const char to char 我发现了strchr被声明为char strchr const char int 在两个不同的来源pubs opengro
  • 如何向上下文添加透明渐变蒙版

    我正在使用quartz 2d 绘制饼图 我使用图层在底部绘制饼图的反射 我想在反射中添加透明的 alpha 渐变 使其变得越来越透明 直到它变得不可见 有人有主意吗 编辑 更多细节 我的饼图位于 CGLayerRef 中 我首先将此层绘制到
  • 找不到从 cronjob 命令运行的 bash 脚本

    我的 crontab 如下 SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 01 04 root home sphinx scripts daily update
  • 最终与易失性保证对象的安全发布

    来自 Java并发实践 一书 为了安全地发布对象 对对象的引用和 对象的状态必须可见 同时其他线程 A 正确构造的对象可以是 安全发布者 从静态初始化器初始化对象引用 将对它的引用存储到易失性字段或 AtomicReference 中 将对
  • 在 Vue.js 应用程序上使用 Google (GIS) 登录

    显然谷歌将停止服务gapi oauth2 我正在尝试使用他们的新 使用 Google 登录 工具 但它们非常令人困惑 项目结构我有一个 Vue 前端 我需要允许用户使用 google 登录 然后 我需要使用 OIDC 服务器流在我的后端对它
  • Django数据库:按相关数据库中最新对象的字段排序

    我在 django 中有两个数据库表 Device 表用于存储实际设备 DeviceTest 表用于存储每个设备的测试检查 对一个设备进行多次测试 class Device models Model created at models Da