Мне нужно заполнить таблицу базы данных, и в соответствии с этим post правильный способ сделать это - использовать миграцию данных.
У меня есть вспомогательная функция, давайте вызовем ее get_my_values , который возвращает словарь словарей со следующей формой:
{
origin1: { key2: value2, key3: value3, ..., keyN: valueN },
origin2: { key1: value1, key3: value3, ..., keyN: valueN },
...
originN: { key1: value1, key2: value2, ..., keyN-1: valueN-1 },
}
Например:
{
'ABC': { 'DEF': 1, 'GHI': 2 },
'DEF': { 'ABC': 1, 'GHI': 3 },
'GHI': { 'ABC': 2, 'DEF': 3 },
}
И таблица, которую я хочу заполнить, имеет такую форму:
ORIGIN | 'ABC' | 'DEF' | 'GHI' |
char | float | float | float |
Итак, после этой записи я создал следующую миграцию:
from django.db import migrations
from myapp.utils import get_my_values
def populate_my_table(apps, schema_editor):
Data = apps.get_model('myapp', 'Table')
my_data_dict = get_my_values()
for origin in my_data_dict.keys():
# insert into Data.origin the current origin
# if the Data.origin == Data.column, insert in this column the value 0
# else, insert in each Data.column, the corresponding value from my_data_dict[origin]['column']
class Migration(migrations.Migration):
dependencies = [
('myapp', 'the_table_migration'),
]
operations = [
migrations.RunPython(populate_my_table),
]
Как видите, я написал псевдокод для его заполнения. Но я изо всех сил пытаюсь на самом деле превратиться в настоящий код.
В конце концов, я ожидаю такие записи:
ORIGIN | ABC | DEF | GHI |
ABC | 0.0 | 1.0 | 2.0 |
DEF | 1.0 | 0.0 | 3.0 |
GHI | 2.0 | 3.0 | 0.0 |