复制模型实例和相关模型的更好方法

时间:2014-08-04 12:36:53

标签: python django

我一直在寻找复制模型实例和相关模型的最快速,最简单的方法。我发现了一些技巧herehere,但我认为它们基于旧的django版本。

我用循环实现了它,但有没有更好的方法呢?我尝试了django-forkit plugin但遇到了problem with model that have a foreignkey field with auth.User.

型号:

class Book(Folder):
    filename = models.CharField(max_length=255)
    created_by = models.ForeignKey(User)

class Chapter(models.Model):
    book = models.ForeignKey(Book)
    name = models.CharField(max_length=255, db_index=True)

class Page(models.Model):
    book = models.ForeignKey(Book)
    attribute_value = hstore.DictionaryField(db_index=True)

重复功能:

    book = Book.objects.get(pk=node_id, created_by=request.user)
    chapters = Chapter.objects.filter(book=book)
    pages = Page.objects.filter(book=book)
    book.pk = None
    book.id = None
    book.filename = book.filename + "_copy"
    book.save()
    for chapter in chapters:
        chapter.book= book
        chapter.pk = None
        chapter.save()
    for page in pages:
        page.book= book
        page.pk = None
        page.save()

1 个答案:

答案 0 :(得分:1)

如果模型真的那么简单,我就会像你拥有它一样保持它。

如果没有,或者你想过度设计它;),那么我个人喜欢的设计模式是明确声明受复制操作影响的字段并循环遍历这些字段。这可以防止您在模型API上进行攻击并(可能)使您的代码无法升级。您的模型还可以自我描述副本中发生的情况,这对于您可能不希望翻译的某些字段非常方便。例如:

class CopyableModel(models.Model):
    # these fields are persisted across copies
    _copy_concerns = ['title', 'author', 'body']

    def create_copy(self):
        attrs = {}
        for concern in self._copy_concerns:
           attrs[concern] = getattr(self, concern)

        # does this work?  Might have to access the CopyableModel definition in a different way...
        # Like self.__class__.objects.create( ...
        return CopyableModel.objects.create(**attrs)

你可以稍微摇摆一下来处理m2m和其他关系。再一次,不确定它在你的特定情况下是值得的,但是当你需要它时,这是一个很好的可扩展模式。