2017-01-19 61 views
2

我試圖在Django數據庫中更新用戶。更新Django模型對象的多個字段的有效方法

獲取的數據如下:

fetched_data = { 
    'id': 1, 
    'first_name': 'John', 
    'last_name': 'Doe', 
    'phone': '+32 12', 
    'mobile_phone': '+32 13', 
    'email': '[email protected]', 
    'username': 'myusername' 
} 

我得到這個ID用戶如下:

old_user = User.objects.get(pk=fetched_data['id']) 

如果我更新用戶如下:

old_user.username = fetched_data['username'] 
old_user.first_name = fetched_data['first_name'] 
...... 
old_user.save() 

它工作正常,但我不想爲每個記錄做它,因此我特里d類似於:

for fetched_data_key in fetched_data: 
    old_user.fetched_data_key = fetched_data['fetched_data_key'] 
    //old_user[fetched_data_key] = fetched_data['fetched_data_key'] --- I tried this way to 
    old_user.save() 

但這並不奏效。任何想法如何更新用戶而不用爲每個記錄做?

回答

4

您可以更新數據庫中的一行而不需要獲取並反序列化它; update()可以做到這一點。例如: -

User.objects.filter(id=data['id']).update(email=data['email'], phone=data['phone']) 

這將發出一個SQL語句update,比在您的文章中的代碼快得多。它永遠不會獲取數據或浪費時間創建一個User對象。

但是,您不能將一大堆更新數據發送到SQL數據庫,並要求它一次性將其映射到不同的行。如果您需要非常快速地進行大規模更新,那麼最好的辦法是將數據插入一張單獨的表格中,然後update it form a select on that table。就我所知,Django ORM不支持這一點。

3
setattr(old_user, fetched_data_key, fetched_data['fetched_data_key']) 
5

即使你使用的方法.update()QuerySet對象簡單:

my_id = fetched_data.pop('id') # remove 'id' from `fetch_data` 
           # as it is not supposed to be updated 

User.objects.filter(pk=my_id).update(**fetched_data) 
#   unpack the content of `dict`^

將解壓fetched_data字典的內容和將更新User對象,其列是記錄存在關鍵fetched_data字典。由於您在pk上調用過濾器,它將始終返回單個記錄。

相關問題