我怎样才能有效地复制Django集?

时间:2012-01-16 19:30:19

标签: django

我在Django应用程序中有一个大型的Course对象数据集。

courses = Course.objects.all()

我想复制这些课程,除了新课程有不同的学期价值。我试过这段代码:

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

但是,此代码无效。它只是改变了当前课程的学期。

如何有效地复制旧数据集?谢谢。

3 个答案:

答案 0 :(得分:8)

正如how Django knows whether to update or insert上的文档所示,如果一个对象设置了主键值,Django将始终对该对象进行更新。

因此克隆对象的简单方法是将其pk(通常为id)设置为None。然后,当你保存时,Django将创建一个新对象。

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

答案 1 :(得分: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()

答案 2 :(得分:0)

如果我理解正确,您需要创建一个全新的课程列表,但它们在semester上有所不同,对吗?

您可以尝试newCourse = copy.copy(course),因为newCourse = course会创建对course的引用,当您修改该引用时,您可以修改对象本身。