🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1287閲覧

Django 外部キー設定しているモデルでCSVからSQLITEにデータを挿入したい

NS78

総合スコア11

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/04 01:31

現在、DjangoにてCSVファイルからsqliteにsaveする処理を制作しています。CSVの内容をそのまま、ROUTE_MASTERテーブルに入れたいのですが、ROUTE_MASTERのROUTE_CODEをS_CONFIGの外部キーに設定しており、下記のようなエラーが出てしまいます。様々な記事を見ながら試行錯誤してみたのですが、解決できませんで、ご教授いただけると助かります。

Cannot assign "(<S_CONFIG: E1>, False)": "ROUTE_MASTER.ROUTE_CODE" must be a "S_CONFIG" instance.

因みにですが、初心者で書籍を参考にしながらDjangoを勉強しておりますので、質問の意図や内容に不備がありましたら申し訳ございません。

モデルは下記のように設定し、makemigrations,migrateしております。

python

1# Djangoのmodels.py 2class S_CONFIG(models.Model): 3 ROUTE_CODE = models.CharField(max_length=2, primary_key=True) 4 ROUTE_NAME = models.CharField(max_length=50,) 5 ROUTE_KANA = models.CharField(max_length=50,) 6 KP_MAX = models.CharField(max_length=5, blank=True, null=True,) 7 COMPANY_CODE = models.CharField(max_length=10, null=True,) 8 COMPANY_NAME = models.CharField(max_length=50,) 9 COMPANY_KANA = models.CharField(max_length=50,) 10 11 def __str__(self): 12 return self.ROUTE_CODE 13 14class ROUTE_MASTER(models.Model): 15 ROUTE_CODE = models.ForeignKey( 16 S_CONFIG, on_delete=models.CASCADE, related_name='ROUTE_ID',) 17 KP = models.CharField(max_length=5, blank=True, null=True,) 18 KP_LAT = models.FloatField() 19 KP_LON = models.FloatField() 20 KP_ELE = models.FloatField() 21 DEV_LOAD = models.IntegerField() 22 ERR_LAT = models.IntegerField() 23 ERR_LON = models.IntegerField() 24 25 def __str__(self): 26 return self.ROUTE_CODE 27 28 class Meta: 29 constraints = [ 30 models.UniqueConstraint(fields=['ROUTE_CODE', 'KP'], name='UNIQUE_ROUTE_KP'), 31 ]

下記の処理でupload.htmlからCSVをアップロードし、CSVの値自体は取得できます。

python

1# Djangoのviews.py 2 3from django.shortcuts import render 4from .models import ROUTE_MASTER, S_CONFIG 5import csv 6from io import TextIOWrapper, StringIO 7 8def upload(request): 9 10 if 'csv' in request.FILES: 11 form_data = TextIOWrapper(request.FILES['csv'].file, encoding='utf-8') 12 csv_file = csv.reader(form_data) 13 14 for line in csv_file: 15 route_cd = S_CONFIG.objects.get_or_create(ROUTE_CODE=line[0]) 16 kilo_post = line[1] 17 kp_lat = line[2] 18 kp_lon = line[3] 19 kp_ele = line[4] 20 dev_load = line[5] 21 err_lat = line[6] 22 err_lon = line[7] 23 save_data = ROUTE_MASTER( 24 ROUTE_CODE=route_cd, 25 KP=kilo_post, 26 KP_LAT=kp_lat, 27 KP_LON=kp_lon, 28 KP_ELE=kp_ele, 29 DEV_LOAD=dev_load, 30 ERR_LAT=err_lat, 31 ERR_LON=err_lon 32 ) 33 save_data.create() 34 35 return render(request, 'calculate/upload.html') 36 37 else: 38 return render(request, 'calculate/upload.html')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「コードのどの部分でCannot assign "~エラーが発生しているか」が全く記載されていないのですが、

route_cd = S_CONFIG.objects.get_or_create(ROUTE_CODE=line[0])

の部分で発生していると推測します。

その前提で、エラーの後半を見ると

Cannot assign "(<S_CONFIG: E1>, False)": "ROUTE_MASTER.ROUTE_CODE" must be a "S_CONFIG" instance.

「ROUTE_MASTER.ROUTE_CODEはS_CONFIGのインスタンスでなければならない」と言ってます。

つまり、エラーの原因は、
S_CONFIG.objects.get_or_create()で指定するキーは、S_CONFIGオブジェクトでなければならないところ、
line[0]というstrオブジェクトを渡しているから

ではないでしょうか?

したがって、strオブジェクトではなく、対応するS_CONFIGオブジェクトをわたせばよいのでは?

diff

1def upload(request): 2 3 if 'csv' in request.FILES: 4 form_data = TextIOWrapper(request.FILES['csv'].file, encoding='utf-8') 5 csv_file = csv.reader(form_data) 6 7 for line in csv_file: 8- route_cd = S_CONFIG.objects.get_or_create(ROUTE_CODE=line[0]) 9+ s_config = S_CONFIG.objects.get(pk=line[0]) 10+ route_cd = S_CONFIG.objects.get_or_create(ROUTE_CODE=s_config) 11 kilo_post = line[1]

投稿2021/02/04 03:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NS78

2021/02/04 23:51

お返事遅れまして申し訳ございません。 ご回答ありがとうございます。 上記のようにしてみたところ上手く動くようになりました。ご丁寧に教えていただきありがとうございます。 > S_CONFIGオブジェクトでなければならないところ、 line[0]というstrオブジェクトを渡しているから なるほどです!こんな初歩的なこともわからないとは、と自分にがっかりしております…。 とても助かりました。本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問