Джанго Селективная Дампдата

Можно ли выборочно фильтровать, какие записи выводятся команды управления Ddango Dumpdata? У меня есть несколько моделей, каждая из которых содержит миллионы строк, и я хочу вывести только записи в одной модели, соответствующей определенным критериям, а также все записи, связанные с внешним ключом, ссылающиеся на любую из этих записей.

Рассмотрим этот вариант использования. Скажем, у меня была производственная база данных, в которой моя модель User содержит миллионы записей. У меня есть несколько других моделей (журнал, транзакция, покупка, закладки и т. Д.), Все из которых ссылаются на модель пользователя. Я хочу заняться разработкой своего приложения Django и хочу протестировать, используя реалистичные данные. Тем не менее, моя производственная база данных настолько огромна, что я не могу реально сделать снимок всего этого и загрузить его локально. Поэтому в идеале я хотел бы использовать dumpdata для сброса 50 случайных записей пользователя и всех связанных записей в JSON и использовать их для заполнения базы данных разработки.

Есть ли простой способ сделать это?

6 ответов

Решение

Я думаю, что на https://github.com/davedash/django-fixture-magic стоит взглянуть.

Вы найдете дополнительную справочную информацию в Scrubbing вашей базе данных Django.

Этот фрагмент может быть полезен для вас (он отслеживает отношения и сериализует их):

http://djangosnippets.org/snippets/918/

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

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

Также кажется, что функция serializers.serialize() позволяет сериализовать произвольный список конкретных экземпляров модели.

Предположительно, если я реализовал метод natural_key() во всех моих моделях, а затем вызвал serializers.serialize([Users.objects.filter(критерии)]), он должен приблизиться к выполнению того, что я хочу. Возможно, мне придется написать функцию для сканирования всех ссылок FK и включить их в список объектов, переданных для serialize().

Это очень старый вопрос, но я недавно написал специальную команду управления для этого. Выглядит очень похоже на существующий dumpdata команда, за исключением того, что для определения того, как я хочу фильтровать наборы запросов, требуется несколько дополнительных аргументов, и она переопределяет get_objects функция для выполнения фактической фильтрации:

def get_objects(dump_attributes, dump_values):
  qs_1 = ModelClass1.objects.filter(**options["filter_options_for_model_class_1"])    
  qs_2 = ModelClass2.objects.filter(**options["filter_options_for_model_class_2"])    
  # ...repeat for as many different model classes you want to dump...
  yield from chain(qs_1, qs_2, ...)

У меня была та же проблема, но я не хотел добавлять еще один пакет, и фрагмент все еще не позволял мне фильтровать мои данные, и мне просто нужно временное решение

Поэтому я подумал про себя, почему бы не переопределить по диспетчерумолчанию, применить там мой фильтр, взять дамп, а затем вернуть мой код обратно. Это, конечно, слишком взломано и опасно, но в моем случае имело смысл.

Да мне пришлось vim код на реальном сервере, но вам не нужно перезагружать сервер после запуска команды через manage.pyбудет запускать вашу текущую базу кода, поэтому сервер с точки зрения конечного пользователя в основном остается включенным.

      from django.db.models import Manager

class DahlBookManager(Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_edited=False)

class FriendshipQuestion(models.Model):
    objects = DahlBookManager()

а затем запустить dumpdata Команда сделала именно то, что мне нужно, а именно вернула все неотредактированные вопросы в моем случае.

Затем я git checkout mymodelfile.py чтобы вернуть его к исходному состоянию.

Это ни в коем случае не хорошее решение, но оно может кого-нибудь уволить или вывести из строя.

Начиная с Django 3.2, вы можете использовать данные дампа для создания дампа определенного приложения и/или модели. Например, для приложения с именем customer:

      python manage.py dumpdata customer

или, чтобы сбросить модель с именем shoppingcart в клиентском приложении:

      python manage.py dumpdata customer.shoppingcart

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

      python manage.py dumpdata customer --all --indent 4 --output my_fixtures.json

Варианты:

  • --all: сбрасывает записи, даже если вы используете пользовательский менеджер для модели
  • --indent : величина отступа при записи в файл
  • --output : отправить вывод в файл вместо стандартного вывода. Формат по умолчанию — JSON.

См. документы по адресу:https://docs.djangoproject.com/en/3.2/ref/django-admin/#dumpdata .

Другие вопросы по тегам