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
请注意,这是低效的,因为您已经加载了所有相关项目,而不仅仅是最新的项目。