簡體   English   中英

改進Django查詢

[英]Improving the Django Query

我正在嘗試優化以下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
  • TestModel

目標:

  • test_id MyModelidMyModel排序的名為test_id的列上獲取唯一值。
  • 只需要MyModel兩個參數。 它們是test_idcreated_at

目前我可以看到以下改進方法。

  • 使用過濾器查詢中的值僅獲取test_id和created_at。
  • 使用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查詢上使用values_list可以節省內存,因為除了test_id之外你不使用任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM