2017-01-13 10 views
3

Django 1.9とPython 3.4私はの既存のモデルインスタンスをコピーします。以下は私が現在どのように達成したかの例です。私の質問は、より良い方法があるということですか?Djangoモデルインスタンスと関連するすべてのデータをコピーするには

私は投稿を読んだ。 Duplicating model instances and their related objects in Django/Algorithm for recusrively duplicating an objectこれは8歳以上で、Django 1.9以降では動作しません。

私はこれを既に達成するように努力していますか、大丈夫か、Django 1.9の方がいいですか?

モデル

class Book(models.Model): 
    name = models.CharField(max_length=80) 

class Contributor(models.Model): 
    name = models.CharField(max_length=80) 
    books = models.ForeignKey("Book", related_name="contributors") 

コピー機能。それ以外の場合は、新しいBookインスタンスを保存した後にコントリビュータを再作成する必要があります。コピーするインスタンスから既存のコントリビュータを割り当てます。

def copy_book(self, id): 
    view = self.context['view'] 
    book_id = id 
    book = Book.objects.get(pk=book_id) 
    copy_book_contributors = book.contributors.all() 

    book.id = None 
    # make a copy of the contributors items. 
    book.save() 
    for item in copy_book_contributors: 
     # We need to copy/save the item as it will reassign the existing one. 
     item.id = None 
     item.save() 
     book.contributors.add(item) 
+0

? – AKS

+0

@AKS本は、上記の私の例でタイプミスした寄稿者がたくさんいることがあります。私はそれを修正しました、ごめんなさい。 – MrKnotts

答えて

3

この特定のケースでは、あなたはbulk_createできcontributors:今Conributorに関連してどのように

contributor_names = list(book.contributors.values_list('name', flat=True)) 

book.id = None 
book.save() 

# create the contributor object with the name and new book id. 
contributors = [Contributor(name=name, book_id=book.id) for name in contributor_names] 
Contributor.objects.bulk_create(contributors) 
+0

パンツ、私は 'bulk_create'機能を忘れました!リスト内包表記を使用すると、とてもきれいになります。お返事ありがとう! – MrKnotts

+0

私は答えを受け入れます、ありがとう。私が見ることのできる唯一の潜在的な問題は、後でFKをコントリビュータモデルに追加した場合、flat = Trueがこの場合に機能するかどうかわからないことです。しかし、これは私の最初の質問に答えます。ありがとう。 – MrKnotts

+0

だからこそ、私は 'この特別なケースのために'を言いました。あなたが追加のpksを追加した場合、 'values'を使用して変換し、それをdictしてコントリビュータコンストラクタに渡すことができます。それも同様に動作します.. – AKS

関連する問題