1

問題: 3 つの外部キーを持つデータベースがあり、毎日次のルールでユーザー入力を収集する必要があります。

  1. 今日の日付のデータが db に既に存在する場合は、データを取得して表示します。データは複数の行になりますが、各行は 3 つの外部キー (product、branch、merge_version) と date_created (auto_add=True) に基づいて一意にクエリされます。

  2. クエリが何も返さなかった場合は、クラス インスタンスを持つオブジェクトを作成し、空の行を表示します

  3. ユーザーが送信ボタンを 1 つクリックすると、次のルールに従ってデータベース内のデータが更新されます。

    • 送信された各行について、データベースに既存の行が存在するかどうかを検証し、行がある場合は行を更新し、そうでない場合は新しい行を作成します

製品ごとにforループで複数のフォームインスタンスを作成し、辞書をテンプレートページに送信してみましたが、問題なく行が表示されます。

送信をクリックすると、request.POST が次の出力を返すため、最後の行のデータのみが保存されます。

    QueryDict: {u'build_date': [u'2013-10-11', u'2013-10-11', u'2013-10-11', u'2013-10-11', u'2013-10-11', u'2013-10-11', u'2013-10-11', u'
    2013-10-11'], u'cln': [u'5555', u'2222', u'2222', u'2222', u'2222', u'2222', u'2222', u'090909'], u'logs': [u'no logs', u'no logs', u'no logs', u'no logs', u'no logs', u'n
    o logs', u'no logs', u'no logs'], u'rpmt_status': [u'R', u'R', u'R', u'R', u'R', u'R', u'R', u'R'], u'rpmt_result': [u'F', u'F', u'F', u'F', u'F', u'F', u'F', u'F'], u'com
    ments': [u'hghjg', u'hghjg', u'hghjg', u'hghjg', u'hghjg', u'hghjg', u'hghjg', u'hghjg'], u'cbs_other_bugs': [u'666', u'666', u'666', u'666', u'666', u'666', u'666', u'666
    '], u'build_num': [u'12345', u'4444', u'8888', u'8888', u'8888', u'8888', u'8888', u'080808'], u'cbs_merge_blocker': [u'76767', u'76767', u'76767', u'76767', u'76767', u'7
    6767', u'76767', u'76767'], u'csrfmiddlewaretoken': [u'8sNCLiUu23tvqLe1QHdJp1c5sQJmhevw'], u'cbs_waived': [u'89898', u'89898', u'89898', u'89898', u'89898', u'89898', u'89
    898', u'89898']}

行ごとに個別の送信ボタンがある場合、以下の request.POST を取得します

        QueryDict: {u'build_date': [u'2013-10-11'], u'cln': [u'23423'], u'logs': [u'no logs'], u'rpmt_status': [u'R'], u'rpmt_result': [u'F'], u'comments': [u'hghjg'], u'cbs_other_bugs': [u'666'], u'build_num': [u'12345'], u'cbs_merge_blocker': [u'76767'], u'csrfmiddlewaretoken': [u'8sNCLiUu23tvqLe1QHdJp1c5sQJmhevw'], u'cbs_waived': [u'89898']}

しかし、データベース全体を 1 つの送信ボタンで保存したいと考えています。どこが間違っているのか教えてください。または、ModelForm を使用する以外に、この状況を処理する最善の方法はありますか?

4

1 に答える 1

1

基本的に問題は、投稿リクエストを送信するクライアント側にあります。データがクライアント側で適切にパックされていません!

この json データを作成する JavaScript は、サーバー側で期待されるデータ交換形式を尊重しませんでした。

解決策は、適切な辞書形式でデータをパックすることです。これが古いデータ形式でした。

{
    "build_date": [
        "2013-10-11",
        "2013-10-11",
        "2013-10-11",
        "2013-10-11",
        "2013-10-11",
        "2013-10-11",
        "2013-10-11",
        "2013-10-11"
    ],
    "build_num": [
        "12345",
        "4444",
        "8888",
        "8888",
        "8888",
        "8888",
        "8888",
        "080808"
    ],
    "cbs_merge_blocker": [
        "76767",
        "76767",
        "76767",
        "76767",
        "76767",
        "76767",
        "76767",
        "76767"
    ],
    "cbs_other_bugs": [
        "666",
        "666",
        "666",
        "666",
        "666",
        "666",
        "666",
        "666"
    ],
    "cbs_waived": [
        "89898",
        "89898",
        "89898",
        "89898",
        "89898",
        "89898",
        "89898",
        "89898"
    ],
    "cln": [
        "5555",
        "2222",
        "2222",
        "2222",
        "2222",
        "2222",
        "2222",
        "090909"
    ],
    "comments": [
        "hghjg",
        "hghjg",
        "hghjg",
        "hghjg",
        "hghjg",
        "hghjg",
        "hghjg",
        "hghjg"
    ],
    "csrfmiddlewaretoken": [
        "8sNCLiUu23tvqLe1QHdJp1c5sQJmhevw"
    ],
    "logs": [
        "no logs",
        "no logs",
        "no logs",
        "no logs",
        "no logs",
        "no logs",
        "no logs",
        "no logs"
    ],
    "rpmt_result": [
        "F",
        "F",
        "F",
        "F",
        "F",
        "F",
        "F",
        "F"
    ],
    "rpmt_status": [
        "R",
        "R",
        "R",
        "R",
        "R",
        "R",
        "R",
        "R"
    ]
}

これを変更して、product と呼ばれるもう 1 つのレベルのキー (主キー) を追加することを提案しました。すべての配列値は、特定の 1 つの製品に関連しています。というわけでこんな感じ!

{
   "product1":{
      "build_date":[
         "2013-10-11"
      ],
      "cln":[
         "23423"
      ],
      "comments":[
         "hghjg"
      ],
      "cbs_merge_blocker":[
         "76767"
      ],
      "rpmt_status":[
         "R"
      ],
      "logs":[
         "no logs"
      ],
      "cbs_other_bugs":[
         "666"
      ],
      "csrfmiddlewaretoken":[
         "8sNCLiUu23tvqLe1QHdJp1c5sQJmhevw"
      ],
      "build_num":[
         "12345"
      ],
      "cbs_waived":[
         "89898"
      ],
      "rpmt_result":[
         "F"
      ]
   },
   "product2":{
      "build_date":[
         "2013-10-11"
      ],
      "cln":[
         "23423"
      ],
      "comments":[
         "hghjg"
      ],
      "cbs_merge_blocker":[
         "76767"
      ],
      "rpmt_status":[
         "R"
      ],
      "logs":[
         "no logs"
      ],
      "cbs_other_bugs":[
         "666"
      ],
      "csrfmiddlewaretoken":[
         "8sNCLiUu23tvqLe1QHdJp1c5sQJmhevw"
      ],
      "build_num":[
         "12345"
      ],
      "cbs_waived":[
         "89898"
      ],
      "rpmt_result":[
         "F"
      ]
   }
}
于 2016-07-16T20:38:25.420 に答える