Django1.5 - python2.7 - как отображать и обновлять базу данных с 3 внешними ключами

Проблема: у меня есть база данных с 3 внешними ключами, каждый день я должен собирать пользовательский ввод со следующими правилами;

  1. если в базе данных уже есть данные на сегодняшнюю дату, извлеките и отобразите данные. данные приведут к нескольким строкам, но каждая строка будет уникально запрашиваться на основе 3 внешних ключей (продукт, ветвь, версия_слияния) и дата_создания (auto_add=True)

  2. если запрос ничего не вернул, создайте объект с экземпляром класса и отобразите пустые строки

  3. если пользователь нажмет одну кнопку отправки, данные должны быть обновлены в базе данных в соответствии со следующими правилами;

    • For each row submitted, validate if there is already an existing row present in database, if there is a row, update the row, else create a new row

Я попытался создать несколько экземпляров формы в цикле 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']}

если у меня есть отдельная кнопка отправки для каждой строки, я получаю запрос ниже.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']}

Но я хочу сохранить всю базу данных с помощью одной кнопки отправки. Подскажите, пожалуйста, где я ошибаюсь? или есть лучший способ справиться с этой ситуацией, кроме использования ModelForm?


person Sakthi    schedule 18.10.2013    source источник
comment
Есть ли эксперт по Django, чтобы ответить на мой вопрос?   -  person Sakthi    schedule 24.10.2013
comment
Все еще нет никого, чтобы предложить помощь по этому вопросу дизайна?   -  person Sakthi    schedule 26.10.2013


Ответы (1)


В основном проблема связана с клиентской стороной, которая отправляет почтовый запрос. Данные не упакованы должным образом на стороне клиента!

JavaScript, который создает эти данные json, не поддерживает формат обмена данными, ожидаемый на стороне сервера.

Решение состоит в том, чтобы упаковать данные в правильном формате словаря. Таков был старый формат данных;

{
    "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"
    ]
}

Я предложил изменить это, чтобы добавить еще один уровень ключа (первичный ключ), называемый продуктом, и все значения массива связаны с одним конкретным продуктом. Так это выглядит так!

{
   "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"
      ]
   }
}
person Sakthi    schedule 16.07.2016