我在Django应用程序中有一个大型的Course对象数据集。
courses = Course.objects.all()
我想复制这些课程,除了新课程有不同的学期价值。我试过这段代码:
for course in courses:
newCourse = course
newCourse.semester = 'Spring 2012'
newCourse.save()
但是,此代码无效。它只是改变了当前课程的学期。
如何有效地复制旧数据集?谢谢。
答案 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
的引用,当您修改该引用时,您可以修改对象本身。