Джанго Селективная Дампдата
Можно ли выборочно фильтровать, какие записи выводятся команды управления 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 .