2012-01-16 64 views
0

我有一個Django應用程序中的課程對象的大型數據集。如何有效地複製Django集?

courses = Course.objects.all() 

我想複製這些課程,除了新課程有不同的學期值。我試過這段代碼:

for course in courses: 
    newCourse = course 
    newCourse.semester = 'Spring 2012' 
    newCourse.save() 

但是,這段代碼不起作用。這只是改變目前課程的學期。

如何有效地複製舊數據集?謝謝。

回答

8

由於對文件how Django knows whether to update or insert顯示,如果一個對象具有主鍵值集,Django將始終對該對象進行更新。

因此,克隆對象的簡單方法是將其pk - 通常爲id - 設置爲None。然後,當你保存時,Django會創建一個新的對象。

newCourse.semester = 'Spring 2012' 
newCourse.id = None 
newCourse.save() 
+1

這是一個有用的技巧。比複製明確需要的所有字段更容易(在大多數情況下)。儘管我一說... ....「明確比隱含更好」?...只是漫不經心... – 2012-01-16 20:14:14

+0

謝謝。由於新課程和課程引用同一個實體,因此我也可以只做'course.semester ='2012年春季','course.id',然後'course.save()'對嗎?只是好奇,當我做'course.save()'時,哪個課程正在保存?舊的課程還是新舊課程? – dangerChihuahua007 2012-01-17 21:12:28

+0

此外,如何維護對舊課程對象的引用? – dangerChihuahua007 2012-01-17 21:12:50

0

如果我理解正確,您需要創建一個全新的課程列表,但它們在semester上有所不同,對吧?

您可以試試newCourse = copy.copy(course),因爲newCourse = course會創建對course的引用,並且在修改該引用時,您將修改該對象本身。

1

你實際上並沒有創建一個新的對象 - 你只是將一個變量指向現有的記錄。像這樣的東西可能會工作:

for course in courses: 
    newCourse = Course()        # Create a new object 
    newCourse.semester = 'Spring 2012' 
    newCourse.otherProperty = course.otherProperty # Copy other properties as needed 
    newCourse.save() 

你甚至可以在一個方法把這個包起來的Course類:

class Course(models.Model): 
    # Other stuff 

    def copy(semester=None): 
     new_course = Course() 
     new_course.other_property = self.other_property 
     if semester is not None: 
      new_course.semester = semester 
     return new_course 

而只是做:

for course in courses: 
    newCourse = course.copy(semester='Spring 2012') 
    newCourse.save() 
相關問題