APIで飛んできたデータを二つのモデルに分けて(Head,Detail)DBへ保存しています。
この二つのモデルにリレーションをかけると保存が上手く進まず躓きました。
【目標】
二つのデータをリレーションをかけて保存すること。
APIで一度に飛んでくるデータの構造は、
json
1transaction_send¶ms={ "data":[{ 2 "table_name":"TransactionHead", 3 "proc_detail_name":"register_transaction", 4 "rows":[{ 5 "transactionHeadId":"113", 6 "transactionDateTime":"2013-01-20 10:01:34",}] 7 },{ 8 "table_name":"TransactionDetail", 9 "proc_detail_name":"register_transaction", 10 "rows":[{ 11 "transactionHeadId":"113", 12 "transactionDateTime":"2013-01-20 10:01:34", 13 "transactionDetailId":"0",]} 14 } 15]}
このデータを保存する為のモデルは、
Django
1class TransactionHead(models.Model): 2 class Meta: 3 db_table = 'transaction_head' 4 transactionHeadId = models.BigIntegerField(verbose_name="取引ID", null=True) 5 transactionDateTime = models.DateTimeField(verbose_name="取引日時", null=True) 6 7class TransactionDetail(models.Model): 8 class Meta: 9 db_table = 'transaction_detail' 10 transactionHead = models.ForeignKey(TransactionHead, on_delete=models.CASCADE, default=1) 11 transactionHeadId = models.BigIntegerField(verbose_name="取引ID", null=True) 12 transactionDateTime = models.DateTimeField(verbose_name="取引日時", null=True) 13 transactionDetailId = models.IntegerField(verbose_name="取引明細ID", null=True) 14
データをDBに保存する為のコードが下記です。
django
1 2#jsonデータをモデルに保存していくコード 3 # TransactionHead 4 for hd in head_data: 5 head_form = HeadForm(hd) 6 if head_form.is_valid(): 7 head_form.save() 8 9 # TransactionDetail 10 for dd in detail_data: 11 detail_form = DetailForm(dd) 12 if detail_form.is_valid(): 13 detail_form.save() 14 detail_flag += 1 15
そして問題となっている箇所がFormなのですが、
class DetailForm(forms.ModelForm): class Meta: model = TransactionDetail fields = '__all__' # transactionHeadId = forms.IntegerField(label="取引ID", required=False) transactionDateTime = forms.DateTimeField(label="取引日時", required=False)
いくつか試したことは、
①上記のfrom(ForeignKeyの部分を無くす)場合、headデータは保存されましたが、detailデータは保存されませんでした。
②上記の#を入れた箇所にtransactionHead = forms.ModelChoiceField(models.TransactionHead.objects)を入れるとエラーになりました。
③上記の#にforms.IntegerField()を入れましたが、同じくエラーになりました。
リレーションを掛けなかった場合、それぞれにデータが格納されたのは確認しているので、Formのこの箇所に問題があるのは理解できたのですが、解決策が全く見当がつきません。
お知恵をお借りできると幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/05 16:34
2019/01/05 18:36
2019/01/06 02:41
2019/01/06 10:32