3
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"})

谢谢您的帮助。

4

1 回答 1

6

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

我假设您的Model1Model2不相关,否则您将能够使用Django 的相关对象接口。您可以采取以下两种方法:

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

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

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

  2. 使用原始 SQL 查询

    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. 您可以使用此答案中描述的技术在 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 ...''')
    
于 2012-10-01T22:55:27.437 回答