0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Django] createしたいモデルのフィールド数が多い時の対処法

Last updated at Posted at 2020-04-13

オブジェクトを作成したい

models.py
from django.db import models

class Human(models.Model):
     name = models.CharField('名前', max_length=200)
     age = models.IntegerField('年齢', null=True, blank=True)

     def __str__(self):
         return self.name

普通Djangoでオブジェクトを作成するとき、以下のように書く。

taro = Human.objects.create(name='太郎', age=30)
taro.save()

hanako = Human(name='花子', age=2)
hanako.save()

何の問題もないだろう。

こんな時どうする?

models.py
class TestModel(models.Model):
    field_1 = models.CharField('フィールド1', max_length=255)
    field_2 = models.CharField('フィールド2', max_length=255)
    ...
    field_50 = models.IntegerField('フィールド50', null=True)

    def __str__(self):
        return self.field_23

項目が50個あるCSVファイルから、DjangoのORMを通してDB投入したいというケース。
上のHumanモデルみたいにやろうとすると

df = pd.read_csv('test_data.csv')

for _, row in df.iterrows():
    t = TestModel.objects.create(field_1=row[0], field_2=row[1], field_3=row[2]....)

50個も書くなんて正気の沙汰じゃない。

辞書にして展開しながら引数に渡す!

df = pd.read_csv('test_data.csv')

for _, row in df.iterrows():
    dict_data = row.to_dict()
    t = TestModel.object.create(**dict_data)

スマート!

Pythonでは関数の引数にリストやタプル、辞書を展開しながら渡すことができる。

参考

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?