2014-10-01 57 views
0

我有一個模型:創建從現有的新模型實例

class MyModel(models.Model): 
    fieldA = models.IntegerField() 
    fieldB = models.IntegerField() 
    fieldC = models.IntegerField() 

現在,讓我們得到一個QuerySet,例如

qs = MyModel.objects.all() 

我希望能夠改變所有實例的fieldBfieldCqs具有相同的值,並將其保存爲我的數據庫中的新記錄。我需要類似於qs.update(fieldB=2, fieldC=3)的東西,但我不想覆蓋qs中的原始記錄。是否有Django方法可以這樣做(即,不涉及手動編碼的for循環)?

+0

不知道我如何標記重複(本網站的新增內容),但您的答案在這裏:http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-對象並保存到數據庫 – michaelb 2014-10-01 14:55:23

+0

謝謝,但適用於單個實例,是否有辦法爲所有實例執行此操作? (再次,除了通常的'for'循環之外,可能是用單個查詢插入所有記錄的東西)。 – Sirion 2014-10-01 15:03:34

回答

0

我不知道一個Django調用會在一次調用中做你想做的事情,就像update那樣。

這是我能夠最接近的。假設你想操作的對象是qs則:

MyModel.objects.bulk_create(
    MyModel(**{pair[0]: pair[1] for pair in x.iteritems() 
       if pair[0] != MyModel._meta.pk.name}) 
    for x in qs.values()) 

注:

  1. qs.values()回報每個對象一個辭典qs

  2. {pair[0]...}表達式是一種字典理解,它創建一個新的字典減去在MyModel上定義的主字段。

  3. MyModel(**...)創建一個新的MyModel對象,其主鍵設置爲None。它有效地創建一個副本。

  4. bulk_create在一個查詢中創建所有對象。它應該知道的caveats

如果需要提及的話,這裏有的是字典和列表解析,而不是for循環。

相關問題