AttributeError: объект «Настройки» не имеет атрибутапосле попытки совершить миграцию - PullRequest
0 голосов
/ 06 октября 2018

У меня есть несколько моделей, в том числе пользовательский, например:

class User(AbstractUser):

    image = models.ImageField(upload_to=get_image_path, blank=True, null=True)
    objects = NewUserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    def __str__(self):
        return self.email

    class Meta(AbstractUser.Meta):
        swappable = 'stack.User'

Это отлично работало с другими моделями, которые у меня уже есть, пока я не пытаюсь добавить еще один класс:

class Vote(models.Model):

    rate_type = models.BooleanField()
    question = models.ForeignKey("Question", related_name='question_rate', on_delete=models.PROTECT)
    answer = models.ForeignKey("Answer", related_name='answer_rate', on_delete=models.PROTECT)
    user = models.ForeignKey(get_user_model(), on_delete=models.PROTECT)


    class Meta:
        unique_together = [('question', 'user'), ('answer', 'user'), ]

К сожалению, я получаю ошибку при попытке миграции:

Traceback (most recent call last):
      File "manage.py", line 15, in <module>
        execute_from_command_line(sys.argv)
      File "/home/artem/.local/lib/python3.5/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
        utility.execute()
      File "/home/artem/.local/lib/python3.5/site-packages/django/core/management/__init__.py", line 365, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/home/artem/.local/lib/python3.5/site-packages/django/core/management/base.py", line 288, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/home/artem/.local/lib/python3.5/site-packages/django/core/management/base.py", line 335, in execute
        output = self.handle(*args, **options)
      File "/home/artem/.local/lib/python3.5/site-packages/django/core/management/commands/makemigrations.py", line 159, in handle
        migration_name=self.migration_name,
      File "/home/artem/.local/lib/python3.5/site-packages/django/db/migrations/autodetector.py", line 44, in changes
        changes = self._detect_changes(convert_apps, graph)
      File "/home/artem/.local/lib/python3.5/site-packages/django/db/migrations/autodetector.py", line 192, in _detect_changes
        self._build_migration_list(graph)
      File "/home/artem/.local/lib/python3.5/site-packages/django/db/migrations/autodetector.py", line 270, in _build_migration_list
        resolved_app_label, resolved_object_name = getattr(settings, dep[1]).split('.')
      File "/home/artem/.local/lib/python3.5/site-packages/django/conf/__init__.py", line 57, in __getattr__
        val = getattr(self._wrapped, name)
    AttributeError: 'Settings' object has no attribute 'stack.User'

Я озадачен этим, потому что я не изменил ни settings.py, ни что-либо еще.Я могу просто удалить ссылку на пользователя в классе «Голосование», и все снова будет нормально, но, к сожалению, мне нужно оставить ее здесь.Большинство других моделей в том же файле имеют одинаковую ссылку на пользовательский класс через функцию ForeignKey и функцию «get_user_model ()» (возможно, я пытался переключить его с помощью пользовательского класса - тот же результат) - и он работает только с той разницей, что я добавил ихнесколько миграций назад.

django версия 2.0.2 из settings.py:

    # Application definition

INSTALLED_APPS = [
    'stack.apps.StackConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

AUTH_USER_MODEL = 'stack.User'

wsgi.py:

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "StackOverflow.settings")

application = get_wsgi_application()

apps.py:

class StackConfig(AppConfig):
name = 'stack'

Может быть, кто-нибудь сталкивался с этим когда-либо или просто знает решение, как избавиться от этой ошибки?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Фактическая причина была:

    class Meta(AbstractUser.Meta):
        swappable = 'stack.User'

Правильное использование этого здесь помещено https://code.djangoproject.com/wiki/ContribAuthImprovements#Solution%202c:%20Generic%20swappable%20models, и мой вариант совсем не верен, как показано в документах. Но более важно, что ядаже эти строки вообще не нужны.Я даже не мог обратить на это внимание изначально, потому что этот код уже был довольно долгое время и как-то работал, потому что вставка мета-класса не требует изменения базы данных как таковой.Поэтому команды 'makemigrations' просто считали, что ничего не изменилось, если не было сделано фактическое добавление

0 голосов
/ 06 октября 2018

stack приложение должно быть добавлено к настройке INSTALLED_APPS:

INSTALLED_APPS = [
    'stack.apps.StackConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'stack', 
]

AUTH_USER_MODEL = 'stack.User'

Также, чтобы указать модель в ForeignKey, вы можете использовать settings.AUTH_USER_MODEL:

from django.conf import settings

user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...