2012-01-16 6 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

これは便利なトリックです。明示的に必要なすべてのフィールドをコピーするよりはるかに簡単です(ほとんどの場合)。私はそれを言うとすぐに.... "明示的なは暗黙のより良いですか?" ...ちょうど散歩... –

+0

ありがとう。 newCourseとコースは同じエンティティを参照しているので、 'course.semester = 'Spring 2012'''、' course.id'、そして 'course.save()'を正しく実行できますか?私は 'course.save()'を実行すると、どのコースが保存されているのか不思議です。古いコースか、古いコースと新しいコースの両方? – dangerChihuahua007

+0

さらに、古いコースオブジェクトへの参照をどのように維持できますか? – dangerChihuahua007

0

私が正しく理解していれば、全く新しいコースリストを作成する必要がありますが、それはsemesterで異なります。

newCourse = coursecourseへの参照を作成するため、newCourse = copy.copy(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() 
関連する問題