Как вставить данные, возвращаемые из API в текстовом формате, в модели Django

Я использую API (https://www.metoffice.gov.uk/pub/data/weather/uk/climate/datasets/Tmax/date/UK.txt), который возвращает данные в текстовом формате. поэтому с возвращенными данными я хочу добавить эти данные в модель Django. теперь я застрял с проблемой, как я должен разобрать данные, чтобы добавить их в модель. Поскольку данные, возвращаемые этим API, как вы можете видеть, что 2021 год не содержит всех данных.

В настоящее время у меня есть 18 полей в модели Django (каждое поле для каждого значения), и мой подход заключался в том, чтобы извлечь все данные, которые имеют числовой постоянный шаблон, используя regex, и с извлеченными данными я буду вставлять данные в модель DB путем итерации по списку. Но проблема в том, что год 2021 не имеет всех данных, а regex, который я использую, просто извлекает числовые значения из строки, которая возвращается из API.

например:

ear    jan    feb    mar    apr    may    jun    jul    aug    sep    oct    nov    dec     win     spr     sum     aut     ann
2021    4.9    7.0    9.8   10.9   13.4   18.7   21.1   18.9   18.7   14.0                  6.21   11.35   19.56    

код, который я написал до сих пор.

numeric_const_pattern = '[-+]? (?: (?: \d* \. \d+ ) | (?: \d+ \.? ) )(?: [Ee] [+-]? \d+ ) ?'
rx = re.compile(numeric_const_pattern, re.VERBOSE)

r = requests.get('https://www.metoffice.gov.uk/pub/data/weather/uk/climate/datasets/Tmax/date/UK.txt')

years_data = r.text.split('\n', 6)[6].split('\n')
for year in years_data:
    print(rx.findall(year))
    # here i want to insert the values to the django model.

Итак, как я должен продолжить построение логики для этого? Любая помощь будет высоко оценена.

Вы можете написать словарь типа MAP_ROW_TO_FIELDS, чтобы сопоставить каждое поле с вашей позицией по оси x.

Затем пройдитесь по каждой строке и обработайте значения, определенные в ключах словаря, игнорируя пустые или недопустимые позиции.

Далее, используя setattr в каждом ключе, вы можете установить значения непосредственно для экземпляра модели.

import re
import requests


# The key value are the same that the model field names.
# In the tuple the x position of each field (start, end).
MAP_ROW_TO_FIELDS = {
    'year': (0, 5),
    'jan': (6, 11),
    'feb': (12, 19),
    'mar': (20, 26)
    # add others here
}

RE_INT = re.compile('^\d+$') 
RE_FLOAT = re.compile('^\d+\.\d+$') 


url = "https://www.metoffice.gov.uk/pub/data/weather/uk/climate/datasets/Tmax/date/UK.txt"
response = requests.get(url)


line_num = 0
for line in response.text.split('\n'):
    line_num += 1
    if line_num > 6 and line.strip(): # avoid empty lines
        row = RowModel()
        
        for key in MAP_ROW_TO_FIELDS.keys():
            val = line[MAP_ROW_TO_FIELDS[key][0]: MAP_ROW_TO_FIELDS[key][1]]
            val = val.strip()
            # If data match, saves directly to the model.
            if RE_INT.match(val):
                setattr(row, key, int(val))
            elif RE_FLOAT.match(val):
               setattr(row, key, float(val))
            else:
                # print(line)
                print('Unknow value "%s" for field %s' % (val, key))
        
        # Save to database
        row.save()
      

Можно легко получить координаты x, открыв текстовый файл в редакторе кода.

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