【问题标题】:Copy or clone an object instance in Django/Python在 Django/Python 中复制或克隆对象实例
【发布时间】:2012-08-24 08:12:39
【问题描述】:

我有以下场景:

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三个CourseEnrollment,其中两个相同或 - 他的第二门课程获得的评分。

呈现的“模板”应该始终是“最新的”,所以我只需要通过 CourseTemplate.date_added 获取最新的实例。

有谁知道如何避免这个问题?

非常感谢!

【问题讨论】:

  • 您的CourseEnrollment 中的CourseTemplate() 不应该是一对一的而不是简单的类级实例吗?
  • 这是您整个问题的答案吗?其中哪一部分是关于复制的?
  • 我不这么认为。这个想法是教师创建一次课程(模板),然后将其链接到新的 CourseEnrollments。如果第三次之后有变化,我需要一个 1:1 CourseTemplate-CourseEnrollment 关系,这样我就有了评分、描述等的快照。
  • 所以您只想知道如何将 CourseTemplate 实例克隆到新实例?
  • 我想我需要在CourseEnrollment中实现一个函数,创建一个唯一的CourseTemplate副本并保存。 a) 这可能是错误的 b) 我不知道如何复制对象实例 :)

标签: python database django oop deep-copy


【解决方案1】:

您可以复制任何现有的 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 

【讨论】:

  • 清除 PK 后,原始的 'ct' 是否仍然可用(尤其是作为其他 CourseEnrollment 实例的参考)?
  • 是的。不伤原著。 save 方法只是看到没有 pk 并进行插入。不过,您需要再次查询原始 ct,因为该 ct 现在将成为新的克隆。
  • 如果您已经拥有源实例并且您想避免额外的数据库访问,您也可以使用:ct2=copy(ct) where copy from: from copy import copy。然后清除pk。
  • 如果您也在寻找它:link to the documentation (django 1.6)。注意那里提到的关于模型继承的特殊情况。
猜你喜欢
  • 2012-06-19
  • 2013-04-06
  • 2011-10-17
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多