gpt4 book ai didi

python - Django数据库: sorting by field in latest object in relative database

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:38 27 4
gpt4 key购买 nike

我在 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(???)

最佳答案

您可以annotate最新 created_at 时间的查询集。

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在一个查询中获取所有相关的设备测试。 (下面的代码未经测试,我的语法可能略有错误)。

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

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

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

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

关于python - Django数据库: sorting by field in latest object in relative database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32611275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com