Как мне «протравить» экземпляры моделей Django в базе данных в пример кода Python, который я могу использовать для загрузки образцов данных? - PullRequest
6 голосов
/ 26 января 2012

Как я могу "протравить" экземпляры моделей Django в базе данных в пример кода Python, который можно использовать для загрузки образцов данных?

Я хочу:
1) Сделайте снимок нескольких сотен записей, которые я сохранил в базе данных MySQL для проекта Django
2) Сделайте этот снимок и измените данные в нем (вычеркнув имена)
3) Преобразуйте эти данные в «маринованную строку» или фактический код Python, который я могу использовать для загрузки данных в новую учетную запись пользователя.

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

Ответы [ 2 ]

13 голосов
/ 26 января 2012

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

Чтобы сохранить модель как диктовку, вы можете использовать встроенную функцию Django:

from django.forms.models import model_to_dict
my_dict = model_to_dict(my_instance,fields=[],exclude=[])

После того, как вы преобразовали экземпляр в dict и отредактировали все, что необходимо, просто используйте обычные методы pickle.dumps и pickle.loads для хранения и извлечения данных.Чтобы создать новый экземпляр модели, используя этот dict, вы можете сделать что-то вроде:

my_instance = MyModel(**my_dict)
#add any customization for the new instance here
my_instance.save()
3 голосов
/ 05 августа 2015

В Django версии 1.8 и выше, если ваши модели имеют внешние ключи, вы можете использовать:

my_dict = dict([(f.attname, getattr(instance, f.attname))
               for f in instance._meta.get_fields()
               if hasattr(f, 'attname')])
...