Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django/Python中复制或克隆对象实例_Python_Database_Django_Oop_Deep Copy - Fatal编程技术网

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

在Django/Python中复制或克隆对象实例,python,database,django,oop,deep-copy,Python,Database,Django,Oop,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(CourseS

我有以下场景:

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)
现在,教师(=用户)可以首先创建包含所有必需细节的CourseTemplate。保存后,他可以创建一个具体的“注册”,例如本学期的5个课程。也许他在8次注册后改变了一些细节(例如CourseTemplate.description,或者课程现在只有7次而不是8次)

我希望在每个CourseTemplate实例和每个CourseEnrollment之间建立1:1的关系,这样我可以看到例如: -X老师2012年有三次课程记录,其中两次相同或相同 -他在第二门课程中获得了哪个等级

显示的“模板”应该始终是“最新的”,所以我只需要通过CourseTemplate.date_获得最新的实例

有人知道我如何避免这个问题吗


非常感谢

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

ct=CourseTemplate.objects.all()[0]
打印ct.pk
#一些原创pk
ct.pk=无
ct.save()
打印ct.pk
#将是一个新的自动递增

你的
课程汇总中的
CourseTemplate()
不应该是一对一的,而不仅仅是一个类级实例吗?这就是你全部问题的答案吗?这其中哪一部分是专门关于复制的?我不这么认为。其理念是教师创建一个课程(模板),然后将其链接到新的课程列表。如果在第三次之后有变化,我需要一个1:1的CourseTemplate CourseRolliment关系,这样我就有了评级、描述等的快照。所以你只想知道如何将CourseTemplate实例克隆到一个新实例?我想我需要在CourseRolliment中实现一个函数,它创建CourseTemplate的唯一副本并保存它。a) 这可能是错误的,b)我不知道如何复制对象实例:)在清除PK后,原始“ct”是否仍然可用(特别是作为其他CourseRolliment实例的参考?是的。不会伤害原作。save方法只看到没有pk,并执行插入。但是,您需要再次向下查询原始ct,因为此ct现在将是新的克隆。如果您已经拥有源实例,并且希望避免额外的数据库访问,则还可以使用:ct2=copy(ct)where copy from:from copy import copy。然后清除pk。如果您也在寻找它:。注意这里提到的关于模型继承的特例。