Pythonのmodelsのデータをコピー、複製する方法
今回はPythonのmodelsのデータをコピー、複製する方法についてご紹介いたします。
Pythonのmodelsのデータをコピー、複製する方法
「Python manage.py shell」でmodelsを複製したいと思ったときに意外とコピーするための関数がありません。
片っ端からobjects.createでフィールドに値を入れていくのも面倒で困る状況があるかと思います。
しかしながら、3つくらいのコマンドで簡単にmodelsを複製する裏技があるのです。
例として”Products”ディレクトリの配下に次のmodels.pyがあるとします。
各フィールドは今回の趣旨とは関係ありません。フィールドの内容はなんでもいいです。
1 2 3 4 5 6 7 8 9 |
from django.db import models # Create your models here. class Product(models.Model): title = models.CharField(max_length=120) # max_length=required description = models.TextField(blank=True, null=True) price = models.DecimalField(decimal_places=2, max_digits=1000) summary = models.TextField(blank=False, null=False) featured = models.BooleanField(default=False) |
「Python manage.py shell」で次のコマンドを打ちます。
1 2 |
from products.models import Product p = Product.objects.first() |
すると変数"p"にProductのobjectsの一番最初のインスタンスが代入されますよね。
ちなみに今p.idの値は素直に1です。
続いて次のコマンドを打ちます。
1 2 |
p.id=None p.save() |
p.id=Noneと打つのはためらわれるかもしれませんが、p.id=Noneにしてp.save()とするとなんとpが新しいインスタンスに変わるのです。
コマンドを打つ前はlen(Product.objects.all())の値は6ですが、
p.id=None
p.save()
と打つとlen(Product.objects.all())の値が7となり、
p.id
と打ってみると7が返ってきます。
つまり、
p.id=None
p.save()
とidをNoneにしてsaveした時点で"p"が新しいインスタンスに変わるのです。
以上、Pythonのmodelsのデータをコピー、複製する方法でした。
終わりに
今回はPythonのmodelsのデータをコピー、複製する方法についてお伝えいたしました。
しかしながら、原因は不明ですが上記の方法でもコピーができないmodelsの構造があります。
ただし大多数のmodelsにおいて上記の方法でmodelsのコピーが可能です。
みなさんもぜひお試しください。
ディスカッション
コメント一覧
まだ、コメントがありません