Python 改进Django查询

Python 改进Django查询,python,mysql,sql,django,Python,Mysql,Sql,Django,我试图优化以下Django视图 def test_view(request, username): msgs = MyModel.objects.filter(name=username, created_at__range=[start_date, end_date]).order_by('-id') arr = [] for msg in msgs: c = TestModel.objects.get(i

我试图优化以下Django视图

def test_view(request, username):
  msgs = MyModel.objects.filter(name=username,
                                  created_at__range=[start_date, end_date]).order_by('-id')
  arr = []
  for msg in msgs:
    c = TestModel.objects.get(id=msg.test_id)
    if c not in arr:
        arr.append(c)

return render(request, "test.html", {'context': arr})
所以我有两个模型

  • 我的模型
  • 测试模型
目标:
  • 仅从由
    MyModel
    id
    排序的
    MyModel
    中获取名为
    test\u id
    的列上的唯一值
  • 只需要来自
    MyModel
    的两个参数。它们是在
目前,我可以看到以下改进方法

  • 在筛选器查询中使用值仅获取测试\u id和在处创建的\u
  • 在Django中使用mysql Distinct关键字在test_id上进行唯一搜索
  • 通过数据查询集进行不必要的循环
  • 同样,在arr中搜索集合似乎真的不必要而且耗时

我对Django比较陌生。因此,对于我应该如何继续或阅读任何链接的任何帮助,我将不胜感激。

我建议修改您的观点,如下所示:

def test_view(request, username):
    msgs = MyModel.objects.filter(
        name=username, created_at__range=[start_date, end_date]
    ).order_by('-id').values_list('test_id', flat=True)

    arr = TestModel.objects.filter(id__in=msgs)

    return render(request, "test.html", {'context': arr})

这样就避免了在一个查询中获取所需的所有TestModel。另外,在MyModel查询中使用值列表可以节省内存,因为您只使用测试id,不使用任何东西。

我建议您修改视图,如下所示:

def test_view(request, username):
    msgs = MyModel.objects.filter(
        name=username, created_at__range=[start_date, end_date]
    ).order_by('-id').values_list('test_id', flat=True)

    arr = TestModel.objects.filter(id__in=msgs)

    return render(request, "test.html", {'context': arr})

这样就避免了在一个查询中获取所需的所有TestModel。另外,在MyModel查询中使用values\u list可以节省内存,因为您只需使用test\u id即可。

您应该总结视图所做的工作。例如,我不明白为什么要在循环中设置
c.user\u name
c.last\u time
,尤其是在您没有保存任何内容的情况下。什么是
collection
?您的代码中是否只有
c
?请出示您的型号。你的意思是写
TestModel.objects.get(test\u id=msg.test\u id)
?混合使用实名和合成变量名,如
msgs
TestModel
,会让您的问题变得混乱。您需要从MyModel或TestModel中获取哪些id/created_值?您应该总结一下您的视图所做的工作。例如,我不明白为什么要在循环中设置
c.user\u name
c.last\u time
,尤其是在您没有保存任何内容的情况下。什么是
collection
?您的代码中是否只有
c
?请出示您的型号。你的意思是写
TestModel.objects.get(test\u id=msg.test\u id)
?混合使用实名和合成变量名,如
msgs
TestModel
,会让您的问题变得混乱。您需要从MyModel或TestModel获取哪些id/created\u值?