【问题标题】:Copy all fields of a django model instance复制 django 模型实例的所有字段
【发布时间】:2011-04-19 13:17:02
【问题描述】:

好的,我认为这是非常基本的,但由于我是 Django 新手,我不知道如何处理。

我需要复制一个 django-model 的实例。正如here 解释的那样,复制多对多关系存在问题。但我猜附件“django-model-copying.diff”具有该功能。所以我不知道 - 我的 Django 是否已经具备该功能?我不知道怎么称呼它。 帮助将不胜感激。

【问题讨论】:

  • “我需要复制整个 django-model”?您的意思是克隆模型的一个实例 - 即克隆数据库中的一行。这是 - 通常 - 一个可怕的想法。为什么要克隆数据库行?数据关系模型的全部意义在于无需克隆一行。你在做什么?
  • 是的,你的权利 - 我需要复制一个模型的实例。我想复制一个实例及其所有属性和与其他模型的关系。你知道,我考虑过冗余和其他东西- 但对于我的问题 - 这是复制它的最佳方式。
  • @Peter:“但对于我的问题 - 这是复制它的最佳方式”。对不起,但事实并非如此。不可能。您在数据库中有“关系”,这完全没有必要。也许你需要在你走得太远之前修复你的数据模型。
  • 感谢您的快速回复 S.Lott!好的,我会尝试解释.. 所以我们有 2 个模型:用户和书籍。用户有一本名为“泰坦尼克号”的书,其中包含一些内容。现在,另一个用户也想要与那本书的关系。但是,第二个用户想要完全相同的书,但它应该被称为“船正在沉没”..我会复制这本书,并重命名它。 - 我知道,我也可以将书的内容放在另一个模型中 - 但我的模型有点复杂。复制的不多,我确定我需要这种方式.. Soo,你能帮我使用我在标题中提到的功能吗?提前致谢
  • 这不是模型的实例副本,它是具有不同数据的新行

标签: django copy models m2m


【解决方案1】:

docs 包含有关如何执行此操作的说明 - 包括如何处理多对多关系。

【讨论】:

    【解决方案2】:

    值得注意的是,从 django 1.8 开始,您可能拥有UUIDFields。如果您复制模型实例然后保存它,unique 约束将在此列上失败,在这种情况下您必须执行以下操作:

    import uuid
    m = MyModel.objects.get(pk=1)
    m.pk = None
    m.uuid = uuid.uuid4() //generate new uuid
    m.save()
    

    【讨论】:

      【解决方案3】:

      我将尝试回答您的实际问题,因为您在问题中要求的是您提出的解决方案存在问题,正如许多人指出的那样,这并不理想。

      在您提到的 cmets 中:

      我会试着解释一下。所以我们有 2 个模型:用户和书籍。一个用户有一个 书名为《泰坦尼克号》,有一些内容。现在,另一个用户想要一个 也和那本书有关。但是,第二个用户想要完全相同 书,但它应该被称为“船正在沉没”..我会复制 书,并重命名。 - 我知道,我也可以把 用另一个模型预订 - 但我的模型有点复杂。

      看起来您要跟踪三件事:

      1. 用户
      2. 他们的书
      3. 用户对他们“拥有”图书的一些自定义注释。

      对于每个Book,存储其公共信息,例如:

      class Author(models.Model):
          name = models.CharField(max_length=50)
          email = models.EmailField()
      
          def __unicode__(self):
              return unicode(self.name)
      
      class Book(models.Model):
          title = models.CharField(max_length=100)
          author = models.ManyToMany(Author)
          isbn = models.CharField(max_length=13)
          # and so on
      
          def __unicode__(self):
              return unicode(self.title)
      

      现在,你需要存储图书 -> 用户关系,例如一个用户可以拥有多本书,两个用户可能拥有同一本书,并附加了自己的元信息。

      class BookClub(models.Model):
           username = models.ForeignKey(User)
           book = models.ForeignKey(Book)
           comments = models.TextField()
      

      如果您像这样构建模型,您将能够执行以下查询:

      • “每个成员有多少本书?”
      • “什么是最受欢迎的书?”
      • “最不受欢迎的书是什么?”
      • “什么是最受欢迎的作者?”

      【讨论】:

        【解决方案4】:

        您只需执行以下操作:

        m = MyModel.objects.get(pk=1)
        m.id = None
        m.save()
        

        这样,将使用新的id 创建新实例,当然,如果有任何unique 属性,它会在验证期间触发错误。

        注意: 至于你提到的功能 - 它还没有添加到主干,状态是design decision needed,但如果你知道你在做什么,你可以手动将差异应用到你的 django 实例 - 它被称为修补顺便说一句。以下是有关如何执行此操作的一些详细信息:http://ariejan.net/2007/07/03/how-to-create-and-apply-a-patch-with-subversion/。

        【讨论】:

        • 我猜你可以在模型中添加__copy__()/__deepcopy__() 函数,然后保存 m2m 值。或者也许使用pickle.. 我会尝试解决这个问题 - 非常有趣;)
        • 问题是您还必须复制“通过”表,将新模型指向一端,同时指向关系的另一端。
        • 正如 Peter 和 bx2 已经提到的,这并没有解决 m2m 关系的主要问题。
        • 也不适用于 Django 1.2+ - 您还需要设置 m.pk = None - 并且不能解决 m2m 问题。
        猜你喜欢
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        • 2014-11-08
        • 2017-05-07
        • 2019-01-05
        • 2014-05-24
        • 1970-01-01
        相关资源
        最近更新 更多