2016-08-08 8 views
0

私はわかりにくい、簡単ではいらだった問題があります。csvファイルからDjangoモデルにデータをロードする

私はcsvファイルからDjangoモデルにデータをロードしようとしています。次のように

import csv 
def import_db(request): 
    dataReader = csv.reader(open('/home/<name>/webapps/<name2>/employees.csv'), delimiter=',', quotechar='"') 
    for row in dataReader: 
     emp = Employee() 
     emp.first_name = row[0] 
     emp.last_name = row[1] 
     emp.email = row[2] 
     emp.level = row[3] 
     emp.service_area = row[4] 
     emp.service_line = row[5] 
     emp.office = row[6] 
     emp.save() 
return HttpResponse("Completed", content_type="text/plain") 

私は、URLにビューをリンクしました::

from reviews import views as emp 
url(r'^load/$', emp.import_db, name='importdb') 

アイデアは私がリンクに行くときということで、私はビューとして次のスクリプトを書いてこれを行うにはsitename.com/load、私のデータは私の従業員モデルに私のemployee.csvファイルからロードされます。

このスクリプトを実行すると、私のcsvファイル内のすべての行についてDjangoモデルで2つのエントリが取得されます。私はcsvに1530人の従業員ラインを持っており、私がこれを行うと、モデルには3060個のインスタンスが設定されます。さらに厄介なことは、モデル内のエントリの順序がcsvファイルと同じではないため、単に1530モデルインスタンスの2番目の 'グループ'を削除できないということです。私がcsvファイルの20行のデータのサブセットで試しても、私は40のモデルインスタンスを取得します。なぜこれが起こっているのか、私はそれを修正するために何ができるのでしょうか?

ありがとうございます!

答えて

2

ビュー機能でこのロジックを実行することはお勧めできません。なぜあなたのケースでは正確にわからないのですが、同じビュー機能を2回トリガーすることは可能です(たとえば、Google Chromeのようなブラウザでは、URLをアドレスバーに貼り付けるとすぐにバックグラウンドでプリフェッチすることがあります。それがここの問題かどうかはわかりませんが、それは除外する価値があるかもしれません)。

このロジックを確定的に呼び出すことができるcustom management commandに移動することを検討する必要があります。ような何か:

# myapp/management/commands/import_csv.py 
from django.core.management.base import BaseCommand, CommandError 


class Command(BaseCommand): 

    def add_arguments(self, parser): 
     parser.add_argument('csv_file', nargs='+', type=str) 

    def handle(self, *args, **options): 
     for csf_file in options['csv_file']: 
      dataReader = csv.reader(open(csv_file), delimiter=',', quotechar='"') 
      for row in dataReader: 
       emp = Employee() 
       # etc... 
       self.stdout.write(
        'Created employee {} {}'.format(emp.first_name, emp.last_name) 
       ) 

あなたは、その後でこれを呼び出します。

./manage.py import_csv --csvfile "/home/<name>/webapps/<name2>/employees.csv" 

このアプローチはあなたに何が起こっているかをより詳細に制御できますし、まだ存在する場合、それが簡単に(問題をデバッグするようになります)。

あなたがファイルを開いている
+0

ありがとうございました!!これはまさに私が必要としたものです! –

1

、行の数を確認するには、このような何かを:

reader = csv.reader(open('/home/<name>/webapps/<name2>/employees.csv'), delimiter=',', quotechar='"') 
    data = list(reader) 
    print len(data) # check this 
関連する問題