2017-04-10 79 views
1

條件我有idsort列表:更新與在Django

ids = ['123', '456', '789', '901']; 
sorts = [1, 3, 2, 4]; 

我想更新在Django每個id的順序。 這裏是SQL和Django的我曾嘗試:

SQL:

UPDATE "Blogs" 
SET  sort = CASE 
        WHEN id = '123' THEN 1 
        WHEN id = '456' THEN 3 
        WHEN id = '789' THEN 2 
        WHEN id = '901' THEN 4 
       END 
WHERE id IN (ids); 

Django的:

Blogs.objects.filter(
      id=ids 
     ).update(
      sort=Case(
       When(id=123, then=1), 
       When(id=456, then=3), 
       When(id=789, then=2), 
       When(id=901, then=4), 
      ) 
     ) 

但問題是,當IDS有許多因素我不能具體idthenWhen(id={id}, then={sort})。 如何優化Django版本中的更新查詢。 在此先感謝。

+0

你正在使用哪個db? sqlite3或MySQL? –

+0

@zhiqianghuang我使用的是postgresql。 – javimuu

回答

1

Django沒有明確提供您需要的功能。您已經使用CASE, WHEN語法嘗試過它,隨着ids數量的增加,它將變得難以管理。

我能想到的一個解決方案是創建一個只有(id, sort)列的臨時表,並加入到更新Blog表中。

這裏是你如何能做到這一點:

from django.db import connection 

cursor = connection.cursor() 
blog_tbl_name = Blog._meta.db_table 
temp_tbl_name = "tmp_{}".format(blog_tbl_name) 
sql = (
    "CREATE TEMP TABLE {temp_tbl_name} AS " 
    "SELECT id, sort FROM {blog_tbl_name} LIMIT 0;" 
    .format(
     temp_tbl_name=temp_tbl_name, 
     blog_tbl_name=blog_tbl_name 
    ) 
) 

cursor.execute(sql) 
  • 現在,插入(id, sort)值到這個臨時表:

    1. 使用idsortBlog表創建臨時表:

      ids = ['123', '456', '789', '901']; 
      sorts = [1, 3, 2, 4]; 
      
      insert_sql = (
          "INSERT INTO {temp_tbl_name} (id, sort) VALUES (%s, %s);" 
          .format(temp_tbl_name=temp_tbl_name) 
      ) 
      
      # zip these two together and insert 
      cursor.executemany(insert_sql, zip(ids, sorts)) 
      
    2. 現在,最後一部分,你在臨時表中加入IDS更新Blog表:

      update_sql = (
          "UPDATE {blog_tbl_name} blog_tbl " 
          "SET sort=tmp_tbl.sort " 
          "FROM {temp_tbl_name} tmp_tbl " 
          "WHERE blog_tbl.id = tmp_tbl.id;" 
          .format(
           temp_tbl_name=temp_tbl_name, 
           blog_tbl_name=blog_tbl_name 
          ) 
      ) 
      
      cursor.execute(update_sql) 
      

    重要的是要在這裏指出,這整個過程只需要三個查詢和可管理,高效率。