Как я могу эффективно дублировать наборы Django? - PullRequest
0 голосов
/ 16 января 2012

У меня большой набор данных объектов Course в приложении Django.

courses = Course.objects.all()

Я хочу сделать копию этих курсов, за исключением того, что новые курсы имеют разные значения семестра. Я пробовал этот код:

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

Однако этот код не работает. Это просто смена семестров текущих курсов.

Как эффективно сделать копию старого набора данных? Спасибо.

Ответы [ 3 ]

8 голосов
/ 16 января 2012

Как видно из документации по , как Django знает, нужно ли обновлять или вставлять , если объект имеет значение первичного ключа, Django всегда будет обновлять этот объект.

Таким образом, простой способ клонирования объекта - установить его pk - обычно id - в None. Затем, при сохранении, Django создаст новый объект.

newCourse.semester = 'Spring 2012'
newCourse.id = None
newCourse.save()
1 голос
/ 16 января 2012

Вы на самом деле не создаете новый объект - вы просто указываете переменную на существующую запись.Что-то вроде этого, вероятно, будет работать:

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()
0 голосов
/ 16 января 2012

Если я правильно понимаю, вам нужно создать целый новый список курсов, но они отличаются на semester, верно?

Можете ли вы попробовать newCourse = copy.copy(course), потому что newCourse = course создаст ссылкуна course, и когда вы изменяете эту ссылку, вы изменяете сам объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...