Django - Заполнение базы данных для целей тестирования - PullRequest
6 голосов
/ 07 декабря 2009

Мне нужно заполнить мою базу данных кучей фиктивных записей (около 200+), чтобы я мог протестировать созданный мной интерфейс администратора, и мне было интересно, есть ли лучший способ сделать это. Я потратил большую часть своего вчерашнего дня, пытаясь заполнить его вручную (т. Е. Упаковав что-то вроде этого my_model (title = "asdfasdf", field2 = "laksdj" ...) в кучу "для x в диапазоне ( 0,200): "петли" и сдался, потому что это не сработало так, как я ожидал. Я думаю, это - это то, что мне нужно использовать, но разве вам не нужно иметь (существующие) данные в базе данных, чтобы это работало?

Ответы [ 6 ]

7 голосов
/ 07 декабря 2009

Проверить это приложение

https://github.com/aerosol/django-dilla/

Допустим, вы написали свое приложение для блога (о да, ваше любимое!) В Django. Модульные тесты прошли хорошо, и все работает очень быстро, даже эти сверхдлинные запросы, созданные ORM. Вы добавили несколько классифицированных постов, и они по-прежнему стабильны. Вы совершенно уверены, что приложение эффективно и готово к оперативному развертыванию. Правильно? Неправильно.

4 голосов
/ 07 декабря 2009

Для этого можно использовать приборы и команду управления loaddata .

Один из подходов - сделать это так.

  1. Подготовьте свою тестовую базу данных.

  2. Используйте dumpdata для создания JSON-экспорта базы данных.

  3. Поместите это в каталог fixtures вашего приложения.

  4. Напишите свои юнит-тесты, чтобы загрузить этот «прибор».

3 голосов
/ 07 декабря 2009

Django приборы предоставляют механизм для импорта данных на 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 выполняет импорт автоматически. Таким образом, развертывание становится более автоматизированным, но я все еще могу легко внести изменения в исходные данные и повторно запустить импорт.

0 голосов
/ 10 августа 2017

Я бы порекомендовал django-autofixtures вам. Я пробовал и django_seed, и django-autofixtures, но у django_seed много проблем с уникальными ключами. django-autofixtures заботится об уникальных, основных и других ограничениях БД при заполнении базы данных

0 голосов
/ 09 мая 2016

Приложение, рекомендованное принятым ответом, больше не поддерживается, однако в качестве замены можно использовать django-seed:

https://github.com/brobin/django-seed

0 голосов
/ 07 декабря 2009

Я не уверен, зачем вам нужна сериализация. Если вы настроили файл Django settings.py так, чтобы он указывал на тестовую базу данных, заполнение тестовой базы данных должно быть не чем иным, как сохранением моделей.

for x in range(0, 200):
    m = my_model(title=random_title(), field2=random_string(), ...)
    m.save()

Есть лучшие способы сделать это, но если вам нужен быстрый набор тестов, это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...