gpt4 book ai didi

python - 获取结果列表,每个外键 1 个

转载 作者:行者123 更新时间:2023-11-30 00:19:21 26 4
gpt4 key购买 nike

我有一个模型,Reading,它有一个外键,Type。我正在尝试使用以下代码获取每种类型的读数:

    for type in Type.objects.all():
readings = Reading.objects.filter(
type=type.pk)
if readings.exists():
reading_list.append(readings[0])

当然,这样做的问题是它会针对每个传感器读数访问数据库。我尝试过一些查询来尝试将其优化为单个数据库调用,但它们似乎都没有效率。例如,.values 将为我提供按类型分组的读数列表,但它会为我提供每种类型的所有读数,并且我必须在内存中使用 Python 过滤它们。这是不可能的,因为我们正在处理潜在的数百万次阅读。

最佳答案

如果您使用 PostgreSQL 作为数据库后端,您可以使用以下命令在一行中完成此操作:

Reading.objects.order_by('type__pk', 'any_other_order_field').distinct('type__pk')

请注意,发生不同的字段必须始终是 order_by 方法中的第一个参数。请随意将 type__pk 更改为您想要排序类型的实际字段(例如,如果 Type 模型具有 name 属性)。您可以在这里阅读有关不同的更多信息 https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct .

如果您不使用 PostgreSQL,您可以使用 prefetch_lated 方法来实现此目的:

#reading_set could be replaced with whatever your reverse relation name actually is
for type in Type.objects.prefetch_related('reading_set').all():
readings = type.reading_set.all()
if len(readings):
reading_list.append(readings[0])

上面总共只执行2次查询。请注意,我使用 len(),以便在计算对象时不会执行额外的查询。您可以在此处阅读有关 prefetch_lated 的更多信息 https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related .

这种方法的缺点是您首先从数据库中检索所有相关对象,然后只获取第一个。

上面的代码未经测试,但我希望它至少能为您指明正确的方向。

关于python - 获取结果列表,每个外键 1 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23373090/

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