Q&A
実現したいこと
djangoでcsvファイルを読み込み、Foreign Keyのフィールドを含むモデルをDBに登録したい。
前提
DjangoでWEBアプリを作成しています。
PersonモデルとStatモデルがあり、Statモデル内に外部キーでPersonモデルに紐づいているフィールドがあります。
発生している問題・エラーメッセージ
IntegrityError at /score/upload/ NOT NULL constraint failed: score_stat.date
csvからPersonモデルのみをDBに登録することは出来ていますが、Statモデルの保存が上手く出来ない状況です。
該当のソースコード
views.py
1def upload(request): 2 if 'csv' in request.FILES: 3 form_data = TextIOWrapper(request.FILES['csv'].file, encoding='utf-8') 4 csv_file = csv.reader(form_data) 5 stat = Stat() 6 for line in csv_file: 7 person, created = Person.objects.get_or_create(name=line[0]) 8 person.login_user = request.user.id 9 person.player_number = line[1] 10 person.age = line[2] 11 person.sex = line[3] 12 person.save() 13 14 stat,created = Stat.objects.get_or_create(stat_number = line[11]) 15 stat.player = Person.objects.get(player_number=line[1]) 16 stat.date = line[4] 17 stat.total_score = line[5] 18 stat.ob = line[6] 19 stat.penalty = line[7] 20 stat.fw = line[8] 21 stat.par_on = line[9] 22 stat.putt = line[10] 23 stat.save() 24 25 return render(request, 'score/upload.html') 26 27 else: 28 return render(request, 'score/upload.html')
models.py
1class Person(models.Model): 2 name = models.CharField(max_length=32) 3 login_user = models.IntegerField(null=True) 4 sex = models.CharField(verbose_name="性別", choices=settings.SEX, max_length=2) 5 age = models.IntegerField(null=True) 6 player_number = models.IntegerField(null=True) 7 8class Stat(models.Model): 9 player = models.ForeignKey(to=Person, verbose_name='プレイヤー', on_delete=models.CASCADE) 10 date = models.DateField(verbose_name='日付', blank=False, null=False) 11 total_score = models.PositiveSmallIntegerField(verbose_name='スコア', blank=False, null=False) 12 ob = models.PositiveSmallIntegerField(verbose_name='OB', blank=False, null=False) 13 penalty = models.PositiveSmallIntegerField(verbose_name='ペナルティ率', blank=False, null=False) 14 fw = models.PositiveSmallIntegerField(verbose_name='FWキープ率', blank=False, null=False) 15 par_on = models.PositiveSmallIntegerField(verbose_name='パーオン率', blank=False, null=False) 16 putt = models.PositiveSmallIntegerField(verbose_name='パット数', blank=False, null=False) 17 stat_number = models.IntegerField(null=True)
試したこと
ここに問題に対して試したことを記載してください。
views.pyに
stat = Stat()を追加し、
stat.player = Person.objects.get(player_number=line[1])
stat.date = line[4]
〜
stat.save()
としたところエラーは回避できましたが、Statが最後のひとつしか登録されず、get_or_createによる重複回避もできていません。
補足情報(FW/ツールのバージョンなど)
django3.2.1
python3.9
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。