update - python django教學




如何克隆一個Django模型實例對象並將其保存到數據庫中? (7)

使用下面的代碼:

from django.forms import model_to_dict

instance = Some.objects.get(slug='something')

kwargs = model_to_dict(instance, exclude=['id'])
new_instance = Some.objects.create(**kwargs)
Foo.objects.get(pk="foo")
<Foo: test>

在數據庫中,我想添加另一個對象,它是上述對象的副本。

假設我的表有一行。 我想插入第一行對像到另一個主鍵不同的行。 我怎樣才能做到這一點?


克隆具有多個繼承級別的模型,即> = 2或下面的ModelC

class ModelA(models.Model):
    info1 = models.CharField(max_length=64)

class ModelB(ModelA):
    info2 = models.CharField(max_length=64)

class ModelC(ModelB):
    info3 = models.CharField(max_length=64)

請參考here的問題。


嘗試這個

original_object = Foo.objects.get(pk="foo")
v = vars(original_object)
v.pop("pk")
new_object = Foo(**v)
new_object.save()

在這裡小心點。 如果你在某種循環中,並且你逐個檢索對象,這可能是非常昂貴的。 如果你不想調用數據庫,只需要:

from copy import deepcopy

new_instance = deepcopy(object_you_want_copied)
new_instance.id = None
new_instance.save()

它和其他一些答案一樣,但它不會使數據庫調用來檢索對象。 如果要製作數據庫中尚不存在的對象的副本,這也很有用。


將pk設置為None更好,sinse Django可以為您正確創建一個pk

object_copy = MyObject.objects.get(pk=...)
object_copy.pk = None
object_copy.save()

我遇到了一些接受的答案。 這是我的解決方案。

import copy

def clone(instance):
    cloned = copy.copy(instance) # don't alter original instance
    cloned.pk = None
    try:
        delattr(cloned, '_prefetched_objects_cache')
    except AttributeError:
        pass
    return cloned

注意:這使用的解決方案在Django文檔中沒有正式批准,並且它們可能在未來的版本中停止工作。 我在1.9.13中測試了這個。

第一個改進是它允許您通過使用copy.copy繼續使用原始實例。 即使你不打算重用實例,如果你正在克隆的實例作為參數傳遞給函數,那麼執行這一步可能會更安全。 如果不是這樣,調用者在函數返回時會意外地擁有不同的實例。

copy.copy似乎以所需的方式生成Django模型實例的淺表副本。 這是我沒有找到記錄的事情之一,但它的工作原理是酸洗和取消,所以它可能是很好的支持。

其次,獲得批准的答案會留下任何附加到新實例的預取結果。 除非您明確複製多對多關係,否則這些結果不應與新實例關聯。 如果遍歷預取關係,則會得到與數據庫不匹配的結果。 添加預取時打破工作代碼可能是一個令人討厭的驚喜。

刪除_prefetched_objects_cache是刪除所有預取的快捷方式。 後續多次訪問的工作方式好像從未進行過預取一樣。 使用以下劃線開頭的未記錄的屬性可能會要求兼容性問題,但它現在可行。


這裡有一個克隆片段,你可以將它添加到你的模型中:

def clone(self):
  new_kwargs = dict([(fld.name, getattr(old, fld.name)) for fld in old._meta.fields if fld.name != old._meta.pk]);
  return self.__class__.objects.create(**new_kwargs)




django-models