Преобразование ключей/значений request.POST в строки с помощью функции

Я пытаюсь записать значения из request.POST в строковый формат. По умолчанию они всегда начинаются с "epochs-NUMBER-". Поэтому я должен создать цикл For так, чтобы для каждого числа создавалась новая строка.

Редактирование: Запрос исходит от динамической формы Django, в которой нет статических элементов (эпохи динамические). Это стандартный POST-запрос Python. Единственное, что объединяет эти элементы, это то, что все они начинаются одинаково (эпохи-число и т. д.). Запрос обрабатывается через строку (nmea_sting-Function) в файл с помощью Python.

Полный запрос выглядит так. Но мне нужны только значения 'epochs-NUMBER-'

csrfmiddlewaretoken=hJmSuP3O6GmtwBeJhfqb99LaCVOKxgngGNIEqoqhQQR7tQELUVGHeXRXxfnRE1Ah&base-TOTAL_FORMS=1&base-INITIAL_FORMS=0&base-MIN_NUM_FORMS=0&base-MAX_NUM_FORMS=1000&base-0-time=25.06.2024+13%3A36%3A00&base-0-show_differences=on&base-0-show_null=1&source=Manual&epochs-TOTAL_FORMS=3&epochs-INITIAL_FORMS=3&epochs-MIN_NUM_FORMS=0&epochs-MAX_NUM_FORMS=1000&unit_selector=m&unit_selector=m&unit_selector=m&unit_selector=m&epochs-0-target_name=250.01.G&epochs-0-easting=55555&epochs-0-northing=5555&epochs-0-height=555&epochs-0-azimuth=&epochs-0-zenithangle=&epochs-0-slope_dist=&epochs-1-target_name=170.01.G&epochs-1-easting=44646&epochs-1-northing=6554&epochs-1-height=544&epochs-1-azimuth=&epochs-1-zenithangle=&epochs-1-slope_dist=&epochs-2-target_name=150.01.G&epochs-2-easting=78979878&epochs-2-northing=4645&epochs-2-height=455&epochs-2-azimuth=&epochs-2-zenithangle=&epochs-2-slope_dist=

Запрос выглядит следующим образом: Request

Редактирование: Одна цель - epochs-0-etc, следующая - epochs-1-etc. и так далее. К сожалению, мое решение работает только для одной цели на данный момент (epochs-0-etc)

def nmea_string(self, request, target_name):
   my_dict = {}
   keys = []
   values = []
   target_raw_string = ("PTER," + self.short_name + "_TRG," + target_name + "," +
                        self.time.strftime("%Y-%m-%d %H:%M:%S") + "," + str(self.status_target))
   for key, value in request.POST.items():
       keys.append(key)
       values.append(value)
   for i in range(len(keys)):
       my_dict.update({keys[i]: values[i]})
   
   for k, v in my_dict.items():
       if k.startswith('epochs-0-'):
           if v == '':
               v = '-9999.999900'
           if k.startswith('epochs-0-target_name'):
               target_raw_string += "," + v
           else:
               target_raw_string += "," + v + ",0.000000"

   tg_checksum = self.get_checksum(target_raw_string)
   tg_nmea_string = "$" + target_raw_string + "*" + tg_checksum + "\n"

   nmea_string += tg_nmea_string

   return nmea_string

Конечный результат должен выглядеть примерно так:

$PTER,TS_TRG,250.01.G,2024-04-22 23:00:00,129,675666.252000,0.000000,252132.398000,0.000000,412.137000,0.000000,-9999.999900,0.000000,-9999.999900,0.000000,-9999.999900,0.000000*1F
$PTER,TS_TRG,170.01.G,2024-04-22 23:00:00,129,675704.440000,0.000000,252162.055000,0.000000,412.341000,0.000000,-9999.999900,0.000000,-9999.999900,0.000000,-9999.999900,0.000000*1A

Используйте регулярные выражения, чтобы проверить, является ли это эпохой, а также номер эпохи и имя поля:

for k, v in my_dict.items():
    match = re.match(r"epochs-(\d+)-(.+)", k)
    if not match:
       continue
    epoch, field_name = match.groups()
    ...  # rest of your processing

Попутное замечание: Строка запроса выглядит так, как будто она была создана из formset. Почему бы просто не проверить набор форм, а затем сгенерировать строку из очищенных данных отдельных форм? Формы будут расположены в правильном порядке, а cleaned_data содержит только имена полей без префиксов, так что вам не придется использовать регекс. Значения также будут проверены.

Может быть, что-то вроде этого:

formset = YourFormsetClass(request.POST)
if formset.is_valid():
    for form in formsets.forms:
        target_raw_string = ""
        for k, v in form.cleaned_data.items():
            if v == '':
                v = '-9999.999900'
            if k == "target_name":
                target_raw_string  += "," + v
            else:
                target_raw_string += "," + v + ",0.000000"

Без использования regex вы могли бы получить следующее:

from typing import Any

def find_epochs_metrics(request_data: dict[str, Any]):
    for k, v in request_data.items():
        if not k.startswith("epochs-"):
            continue

        k_split = k.split("-")
        epoch_n = k_split[1]

        if not epoch_n.isdigit():
            continue

        field_name = k_split[2]

        ...

Вам следует постараться свести к минимуму использование regex, поскольку они неэффективны и сложны в обслуживании.

Вернуться на верх