factory_boy UserFactory: нет такой таблицы: auth_user

Я пытаюсь создать UserFactory и получаю эту ошибку при запуске ./manage.py test:

OperationalError: no such table: auth_user

Вот как выглядит мой файл factories.py:

import factory
import django.contrib.auth.models as auth_models
from wacep.weatherroulette.models import (
    GameState, Puzzle
)


class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = auth_models.User

    username = factory.Sequence(lambda n: "user_%d" % n)


class PuzzleFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Puzzle

    display_name = factory.Sequence(lambda n: 'Test Puzzle {0}'.format(n))
    description = factory.Sequence(lambda n: 'Description {0}'.format(n))


class GameStateFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = GameState

    user = UserFactory()
    current_inventory = 300

Кто-нибудь знает, что здесь происходит?


person nnyby    schedule 07.10.2014    source источник


Ответы (4)


О.. Кажется, наследование от factory.Factory вместо factory.django.DjangoModelFactory исправляет ошибку.

person nnyby    schedule 07.10.2014

На самом деле ошибка возникает из-за того, что django.contrib.auth не является частью вашего settings.INSTALLED_APPS.

Ошибка, которую вы видите, происходит, когда factory_boy пытается создать django.contrib.auth.models.User и не находит связанную таблицу в базе данных.

Эта таблица должна была быть автоматически создана в начале теста исполнителем тестов Django; тот факт, что он не был создан, означает, что вы не добавили django.contrib.auth к своему INSTALLED_APPS.

person Xelnor    schedule 23.10.2014
comment
У меня действительно было django.contrib.auth в моем settings.INSTALLED_APPS, хотя проблема не в этом. - person nnyby; 29.10.2014

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

user = UserFactory()

На самом деле вы пытаетесь создать объект User без надлежащего использования Django ORM. В качестве примечания: я не полностью проанализировал, что здесь идет не так - либо он пытается создать объект пользователя во время импорта до того, как будет настроена тестовая база данных, либо он фактически не взаимодействует с соответствующей базой данных. В результате, по крайней мере, для создания вашего объекта требуется немного магии Django. И factory_boy предоставляет эту магию.

Изменение этой строки на:

user = UserFactory.create()

должен исправить вашу ошибку.

person Tim Mullen    schedule 13.05.2015

Это действительно поздний ответ, но сегодня я столкнулся с этой проблемой и хочу поделиться своим решением.

Используя django, моя настройка разработки settings.local использует Postgresql, но тестовая настройка settings.test использует sqlite3. Выполнение теста под settings.test привело к ошибке no such table, как показано ниже.

$ DJANGO_SETTINGS_MODULE=myproject.settings.test python manage.py test
OperationalError: no such table: ...

Кажется, это связано с тем, что в базе данных sqlite3 нет схемы, поскольку я никогда не использовал sqlite3 для разработки. Так что я migrate для sqlite

$ DJANGO_SETTINGS_MODULE=myproject.settings.test python manage.py migrate
# ... migration running for sqlite3 ...

Когда миграция завершилась, я мог запустить тесты с тестовой базой данных sqlite3, как и предполагалось.

person Leonard2    schedule 08.11.2017