Если бескомпромиссный сбой, то первый формат имеет смысл. Если Вы хотите быть в состоянии обработать/возвратить все непровальные элементы, необходимо использовать вторую форму. Те были бы моими основными критериями выбора между методами. Лично, если бы это является бескомпромиссным, я не использовал бы вторую форму.
Проверить это приложение
https://github.com/aerosol / django-dilla /
Допустим, вы написали свое приложение для блога (о да, ваше любимое!) на Django. Модульные тесты прошли нормально, и все работает очень быстро, даже те сверхдлинные запросы, сгенерированные ORM. Вы добавили несколько постов по категориям, и он по-прежнему стабилен как камень. Вы совершенно уверены, что приложение эффективно и готово к развертыванию в реальном времени. Правильно? Неправильно.
и все выполняется очень быстро, даже те сверхдлинные запросы, сгенерированные ORM. Вы добавили несколько постов по категориям, и он по-прежнему стабилен как камень. Вы совершенно уверены, что приложение эффективно и готово к развертыванию в реальном времени. Правильно? Неправильно. и все выполняется очень быстро, даже те сверхдлинные запросы, сгенерированные ORM. Вы добавили несколько постов по категориям, и он по-прежнему стабилен как камень. Вы совершенно уверены, что приложение эффективно и готово к развертыванию в реальном времени. Правильно? Неправильно.Для этой цели можно использовать фикстуры и команду управления loaddata .
Один из подходов - сделать это так.
Подготовьте тестовую базу данных.
Используйте dumpdata для создания JSON-экспорта базы данных.
Поместите это в каталог fixtures
вашего приложения.
Напишите свои модульные тесты для загрузки этого «приспособления»: https : //docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.TransactionTestCase.fixtures
Я не уверен, зачем вам нужна сериализация . Пока вы настроили файл Django settings.py так, чтобы он указывал на вашу тестовую базу данных, заполнение тестовой базы данных должно быть не чем иным, как сохранением моделей.
for x in range(0, 200):
m = my_model(title=random_title(), field2=random_string(), ...)
m.save()
Есть лучшие способы сделать это, но если вам нужен быстрый набор тестов , это правильный путь.
Django fixture предоставляет механизм для импорта данных в syncdb
. Однако сделать это начальное распространение данных часто проще с помощью кода Python. Метод, который вы описываете, должен работать либо через syncdb, либо через команду управления. Например, через syncdb в my_app / management.py
:
def init_data(sender, **kwargs):
for i in range(1000):
MyModel(number=i).save()
signals.post_syncdb.connect(init_data)
Или в команде управления в myapp / management / commands / my_command.py
:
from django.core.management.base import BaseCommand, CommandError
from models import MyModel
class MyCommand(BaseCommand):
def handle(self, *args, **options):
if len(args) > 0:
raise CommandError('need exactly zero arguments')
for i in range(1000):
MyModel(number=i).save()
Затем вы можете экспортировать эти данные в прибор или продолжить импорт с помощью команды управления. Если вы решите продолжить использование сигнала syncdb
, вы: Я захочу условно запустить функцию init_data
, чтобы предотвратить импорт данных при последующих вызовах syncdb
. Когда фикстуры недостаточно, мне лично нравится делать и то, и другое: создать команду управления для импорта данных, но при первом вызове syncdb
импорт будет выполнен автоматически. Таким образом, развертывание будет более автоматизированным, но я все равно могу легко внести изменения в исходные данные и повторно запустить импорт.