gpt4 book ai didi

python - 比较两个列表中的元素时使用 django ORM 的最有效方法

转载 作者:行者123 更新时间:2023-11-28 22:01:41 25 4
gpt4 key购买 nike

model_one_list = Model1.objects.all()
model_two_list = Model2.objects.filter(...).order_by(..)

for model in model_one_list:
for model2 in model_two_list:
if model.field == model2.field:
another_list.append(model)

一些关于 django ORM 的在线提示特别提到不要这样做,因为它使用太多内存并损害性能,文档建议尽可能坚持使用 ORM。

我试图用这个解决上面的问题:

Model1.objects.extra(
where={
'field = app_model2.field'
# Not sure if this works, I think the app_model2 may be wrong idk if i
# can access that
},
)

但对于这样的事情,我不太确定如何处理。

还有一个有点相关的最后一个问题。如果我有一个查询集需要简单地按排序计数进行排名,那是什么推荐的无需迭代​​的方法?

Model1.objects.order_by('something').extra(select={'rank':
"how do i get the rank in mysql??? like while its
iterating, is this even possible"})

感谢您的帮助。

最佳答案

第一个问题:加入不相关的模型

我假设您的 Model1Model2 不相关,否则您可以使用 Django's related objects界面。您可以采用以下两种方法:

  1. 使用 extra和一个 SQL 子查询:

    Model1.objects.extra(where = ['field in (SELECT field from myapp_model2 WHERE ...)'])

    在某些数据库(尤其是 MySQL)中,子查询的处理效率不高,因此这可能不如下面的 #2 好。

  2. 使用 raw SQL query :

    Model1.objects.raw('''SELECT * from myapp_model1
    INNER JOIN myapp_model2
    ON myapp_model1.field = myapp_model2.field
    AND ...''')

第二题:枚举结果

两种方法:

  1. 您可以使用内置的 enumerate 在 Python 中枚举查询集功能:

    enumerate(Model1.objects.all())
  2. 您可以使用 this answer 中描述的技术在 MySQL 中进行枚举。像这样:

    Model1.objects.raw('''SELECT *, @row := @row + 1 AS row
    FROM myapp_model1
    JOIN (SELECT @row := 0) rowtable
    INNER JOIN myapp_model2
    ON myapp_model1.field = myapp_model2.field
    AND ...''')

关于python - 比较两个列表中的元素时使用 django ORM 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12681992/

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