Django Как заполнить таблицу миграцией данных? - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужно заполнить таблицу базы данных, и в соответствии с этим 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 |

1 Ответ

3 голосов
/ 11 февраля 2020
def populate_my_table(apps, schema_editor):
    Data = apps.get_model('myapp', 'Table')
    my_data_dict = get_my_values()
    for origin, values in my_data_dict.items():
        data = {'origin': origin, origin: 0.0}
        data.update(values)
        Data.objects.create(**data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...