2010-09-30 46 views
6

好吧,我認爲這是非常基本的,但由於我是Django的新手,我不知道如何處理這個問題。複製django模型實例的所有字段

我需要複製django模型的實例。如解釋here,複製ManyToMany關係存在問題。但是,附件「django-model-copying.diff」具有我想的功能。所以我不知道 - 我的Django已經有這個功能了嗎?我不知道該怎麼稱呼它。 幫助,將不勝感激。

+0

「我需要複製整個Django的模式」?你的意思是克隆一個模型的實例 - 即克隆數據庫中的一行。這通常是一個可怕的想法。你爲什麼要克隆數據庫行?數據關係模型的重點是克隆一行不必要的。你在做什麼? – 2010-09-30 19:46:57

+0

是的,你的權利 - 我需要複製一個模型的實例..我想複製一個實例的所有屬性和關係到其他模型..你知道,我想過冗餘和東西 - 但對於我的問題 - 它是最好的方法來複制它。 – Peter 2010-09-30 19:57:19

+0

@Peter:「但對我的問題 - 這是最好的方法來複制它」。對不起,但事實並非如此。它不可能。你在數據庫中有「關係」,這使得這完全沒有必要。也許在你走得太遠之前,你需要修正你的數據模型。 – 2010-09-30 20:02:44

回答

4

您只需做到以下幾點:

m = MyModel.objects.get(pk=1) 
m.id = None 
m.save() 

這樣,新的實例將與課程的新id任何unique特性將在驗證過程中引發錯誤的情況下被創建。

注: 至於你所提到的功能 - 它沒有添加到主幹,狀態爲design decision needed,但如果你知道你在做什麼,你可以將手動差異適用於你的Django實例 - 它被稱爲修補btw。以下是有關如何操作的詳細信息:http://ariejan.net/2007/07/03/how-to-create-and-apply-a-patch-with-subversion/

+0

是的 - 我知道..但是這樣它就失去了所有的m2m關係.. – Peter 2010-09-30 20:48:20

+0

我想你可以添加'__copy __()'/'__deepcopy __() '函數到你的模型,然後保存m2m值。或者用'pickle' ..我會試着解決這個問題 - 非常有趣;) – bx2 2010-09-30 21:00:47

+1

問題是你必須複製'through'表格,以便在指向另一端的同時指向新模型關係.. – bx2 2010-09-30 21:12:17

4

docs包括如何做到這一點的指示 - 包括如何處理多對多的關係。

1

我會盡量回答你的實際問題,因爲你在問題中要求的是你提出的解決方案的問題,正如許多人指出的那樣並不是很理想。

在評論你提到這一點:

我會盡力解釋。所以,我們有2種型號:用戶和圖書。用戶有一本名爲「泰坦尼克號」的書,其中有一些內容。現在,另一個用戶也希望與該書有 關係。但是,第二個用戶想要的書完全一樣,但它應該被稱爲「Ship is going under」..我會複製 書,並重命名它。 - 我知道,我還可以將 書的內容放在另一個模型中 - 但我的模型稍微複雜一些。

看起來你有三樣東西來跟蹤:

  1. 用戶
  2. 他們的書
  3. 一些定製指出,用戶對他們的「擁有」的書。

對於每個Book,存儲其共同的信息,例如:

class Author(models.Model): 
    name = models.CharField(max_length=50) 
    email = models.EmailField() 

    def __unicode__(self): 
     return unicode(self.name) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.ManyToMany(Author) 
    isbn = models.CharField(max_length=13) 
    # and so on 

    def __unicode__(self): 
     return unicode(self.title) 

現在,你需要存儲書籍 - >用戶關係,比如一個用戶都可以有很多書,兩個用戶可以擁有同一本書,附有自己的元信息。

class BookClub(models.Model): 
    username = models.ForeignKey(User) 
    book = models.ForeignKey(Book) 
    comments = models.TextField() 

如果你組織你的模型那樣,你就可以做這樣的查詢:「多少書沒有每個成員都有」

  • 「什麼是最受歡迎的書?」 「
  • 」什麼是最不受歡迎的書?「
  • 「什麼是最受歡迎的作者?」
0

值得注意的是,從django 1.8開始,你可能有UUIDFields。如果複製模型實例,然後將其保存在unique約束將無法在此列,在這種情況下,你必須做一些事情,如:

import uuid 
m = MyModel.objects.get(pk=1) 
m.pk = None 
m.uuid = uuid.uuid4() //generate new uuid 
m.save() 
相關問題