复制django模型实例的所有字段

时间:2010-09-30 19:44:07

标签: django copy models m2m

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

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

4 个答案:

答案 0 :(得分: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/

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

在评论中你提到了这个:

  

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

看起来你有三件事要跟踪:

  1. 用户
  2. 他们的书籍
  3. 用户对其“拥有”图书的一些自定义说明。
  4. 对于每个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)
    

    现在,您需要存储Book - >用户关系,例如一个用户可以拥有许多书籍,两个用户可能拥有相同的书籍,并附有自己的元信息。

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

    如果您按照这种方式构建模型,您将能够执行以下查询:

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

答案 3 :(得分:0)

值得注意的是,从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()