在Django/Python中复制或克隆对象实例

Jos*_*nel 2 python database oop django deep-copy

我有以下情况:

class CourseTemplate(models.Model):
    title = models.CharField(max_length=70)
    teacher = models.ForeignKey(User)
    description = models.TextField()

    max_students = models.IntegerField()
    sessions = models.ManyToManyField(CourseSession) # e.g. Session 1 Introduction, Session 2 Basics, etc.
    rating = models.ManyToManyFields(StudentRating)
    date_added = models.DateTimeField()

class CourseEnrollment(models.Model):
    course = models.OneToOneField(CourseTemplate) # Each enrollment needs a new CourseTemplate Instance, so I can track it
    students = models.ManyToManyField(User)

Class CourseSession(models.Model):
    title = models.CharField(max_length=50)
    date = models.DateTimeField()
    details = models.CharField(max_length=100)
    address = models.TextField()
    #parent_course = models.ForeignKey(CourseTemplate)

class StudentRating(models.Model):
    student = models.ForeignKey(User)
    rating = models.IntegerField()
    #course = models.ForeignKey(CourseTemplate)
Run Code Online (Sandbox Code Playgroud)

现在,教师(=用户)可以首先创建包含所有必需详细信息的CourseTemplate.保存之后,他可以为本学期创建一个具体的"注册",共有5个课程.也许他在8次注册后更改了一些细节(例如,CourseTemplate.description或课程现在只有7个会话而不是8个).

我想在每个CourseTemplate实例和每个CourseEnrollment之间建立1:1的关系,所以我可以看到例如: - 教师X有2012年的三个CourseEnrollments,其中两个相同或者 - 他的第二个收到的评分课程.

提供的"模板"应该始终是"最新的",所以我只需要通过CourseTemplate.date_added获取最新的实例.

有谁知道我怎么能避免这个问题?

非常感谢!

jdi*_*jdi 20

您可以通过清除其主键来复制任何现有的django模型实例,然后再次保存它.

ct = CourseTemplate.objects.all()[0]
print ct.pk
# some original pk

ct.pk = None
ct.save()
print ct.pk
# will be a new auto-incremented 
Run Code Online (Sandbox Code Playgroud)

  • 如果您已经拥有源实例并且您想要避免额外的数据库访问,您还可以使用:ct2 = copy(ct)其中copy来自:copy copy copy.然后清除PK. (3认同)