ФорумПрограммированиеPythonDjango → Фигня с разделением моделей

Фигня с разделением моделей

  • john2dark

    Сообщения: 99 Репутация: N Группа: Адекваты

    Spritz 18 марта 2016 г. 1:39

    В начале был один файл members/models.py
    на седьмой день понял что нахер мне не упало пихать тьму классов в один файл и решил разделить это непотребство через models/
    зафигачил пакетик
    в файлик __init__.py пихнул

    from account import Account

    в этой же папке соответственно есть account.py
    с классом Account внутри
    Но не в этом суть, есть один очень неприятный штук в конфиге джанги, а именно:

    AUTH_USER_MODEL = 'members.models.account.Account'

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

    Когда все было в одном файлике models.py, всё работало отлично, а вот с подобным выделением моделей в отдельный пакет возникает ошибка:

    
    Traceback (most recent call last):
      File "C:\Python27\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
        fn(*args, **kwargs)
      File "C:\Python27\lib\site-packages\django\core\management\commands\runserver.py", line 109, in inner_run
        autoreload.raise_last_exception()
      File "C:\Python27\lib\site-packages\django\utils\autoreload.py", line 249, in raise_last_exception
        six.reraise(*_exception)
      File "C:\Python27\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
        fn(*args, **kwargs)
      File "C:\Python27\lib\site-packages\django\__init__.py", line 18, in setup
        apps.populate(settings.INSTALLED_APPS)
      File "C:\Python27\lib\site-packages\django\apps\registry.py", line 108, in populate
        app_config.import_models(all_models)
      File "C:\Python27\lib\site-packages\django\apps\config.py", line 202, in import_models
        self.models_module = import_module(models_module_name)
      File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
        __import__(name)
      File "C:\Python27\lib\site-packages\allauth\account\models.py", line 22, in <module>
        class EmailAddress(models.Model):
      File "C:\Python27\lib\site-packages\django\db\models\base.py", line 158, in __new__
        new_class.add_to_class(obj_name, obj)
      File "C:\Python27\lib\site-packages\django\db\models\base.py", line 299, in add_to_class
        value.contribute_to_class(cls, name)
      File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line 703, in contribute_to_class
        super(ForeignObject, self).contribute_to_class(cls, name, virtual_only=virtual_only)
      File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line 308, in contribute_to_class
        lazy_related_operation(resolve_related_class, cls, self.remote_field.model, field=self)
      File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line 85, in lazy_related_operation
        return apps.lazy_model_operation(partial(function, **kwargs), *model_keys)
      File "C:\Python27\lib\site-packages\django\db\models\fields\related.py", line 83, in <genexpr>
        model_keys = (make_model_tuple(m) for m in models)
      File "C:\Python27\lib\site-packages\django\db\models\utils.py", line 13, in make_model_tuple
        app_label, model_name = model.split(".")
    ValueError: too many values to unpack
    

    В творческом процессе гугления найти вменяемое не удалось.
    Сильно подозреваю, что во всём виноват

    AUTH_USER_MODEL = 'members.models.account.Account'

    и джанго тупо не видит мою попытку подсунуть ему сюда путь до нужной модели.
    А как это сделать правильно, я не врубаюсь. Может подскажет кто?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 18 марта 2016 г. 1:42, спустя 2 минуты 14 секунд

    AUTH_USER_MODEL = 'members.models.account.Account'

    формат неверный, надо $AppName.ModelName

    То есть у тебя будет

    AUTH_USER_MODEL = 'members.Account'

    Спустя 45 сек.

    А из папки account подсосет само, не парьсо, питон в этом плане охуенен, у него что из файла __init__ жрать, что из файла что из папки - все как не в себя жрет автоматически :)

    Сапожник без сапог
  • john2dark

    Сообщения: 99 Репутация: N Группа: Адекваты

    Spritz 18 марта 2016 г. 1:57, спустя 14 минут 52 секунды

    Клёва, теперь насмерть заебавшая ошибка с 'too many values to unpack' поменялась на другую, хоть какой то прогресс, что уже радует, спасибо :)
    А именно, есть форма, в соседнем пакете
    forms.py

    
    class SignupForm(forms.Form):
        bla..
        bla..
    
        class Meta:
            model = get_user_model()
            fields = [
                'email',
                'password1',
                'password2',
                'agree_terms',
                'subscribe',
            ]
    

    И соответственно ошибка:

    
    [skipped]
      File "project\core\views.py", line 8, in <module>
        from forms import SignupForm
      File "project\core\forms.py", line 14, in <module>
        class SignupForm(forms.Form):
      File "project\core\forms.py", line 35, in SignupForm
        class Meta:
      File "project\core\forms.py", line 36, in Meta
        model = get_user_model()
      File "C:\Python27\lib\site-packages\django\contrib\auth\__init__.py", line 155, in get_user_model
        "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
    django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'members.Account' that has not been installed
    

    т.е. get_user_model() не видит нифига автоподсос походу
    щас попробую сюда директом прописать модель.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 18 марта 2016 г. 2:05, спустя 8 минут 40 секунд

    @john2dark, yе надо ничего прописвыать, покажи свой INSTALLED_APPLICATIONS список

    Сапожник без сапог
  • john2dark

    Сообщения: 99 Репутация: N Группа: Адекваты

    Spritz 18 марта 2016 г. 2:12, спустя 6 минут 36 секунд

    
    DJANGO_APPS = [
        'django.contrib.auth',
        'django.contrib.sites',  # required by django-allauth
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    THIRD_PARTY_APPS = [
        'allauth',
        'allauth.account',
        'allauth.socialaccount',
        'allauth.socialaccount.providers.facebook',
        'allauth.socialaccount.providers.google',
        'allauth.socialaccount.providers.twitter',
        'allauth.socialaccount.providers.vk',
        'widget_tweaks',
        'tz_detect',
    ]
    
    PROJECT_APPS = [
        # 'api',
        'core',
        'admin',
        'members',
    ]
    
    # https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
    INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS + THIRD_PARTY_APPS
    
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 18 марта 2016 г. 2:14, спустя 2 минуты 11 секунд

    казырные либы юзаешь :)

    Спустя 138 сек.

    @john2dark, подозреваю тебе в form.Meta надо просто использовать settings.AUTH_USER_MODEL, так как при текущем work flow у тебя выполняется доступ к модели которая еще не успела загрузиться. Тут нужно lazy поведение

    Спустя 74 сек.

    Либо если так нахуй пошлет - то напрямую проимпортировать модель юзера своего сюда :) Главное тогда в рекурсию не уйти бесконечную, но думаю все банально и сработает тупо с настройкой settings.AUTH_USER_MODEL

    Сапожник без сапог
  • john2dark

    Сообщения: 99 Репутация: N Группа: Адекваты

    Spritz 18 марта 2016 г. 2:28, спустя 14 минут 16 секунд

    Понял, щас буду пробовать, спасибо чуваг :)

  • john2dark

    Сообщения: 99 Репутация: N Группа: Адекваты

    Spritz 18 марта 2016 г. 2:56, спустя 27 минут 46 секунд

    А хер там, с настройкой settings.AUTH_USER_MODEL не проканало.
    AUTH_USER_MODEL = 'members.Account'
    Вот жеж скАтина. Всё равно пишет LookupError: App 'members' doesn't have a 'account' model.
    И вот что странно по трейсу

    
    Traceback (most recent call last):
      File "C:\Python27\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
        fn(*args, **kwargs)
      File "C:\Python27\lib\site-packages\django\core\management\commands\runserver.py", line 116, in inner_run
        self.check(display_num_errors=True)
      File "C:\Python27\lib\site-packages\django\core\management\base.py", line 426, in check
        include_deployment_checks=include_deployment_checks,
      File "C:\Python27\lib\site-packages\django\core\checks\registry.py", line 75, in run_checks
        new_errors = check(app_configs=app_configs)
      File "C:\Python27\lib\site-packages\django\contrib\auth\checks.py", line 12, in check_user_model
        cls = apps.get_model(settings.AUTH_USER_MODEL)
      File "C:\Python27\lib\site-packages\django\apps\registry.py", line 197, in get_model
        return self.get_app_config(app_label).get_model(model_name.lower())
      File "C:\Python27\lib\site-packages\django\apps\config.py", line 166, in get_model
        "App '%s' doesn't have a '%s' model." % (self.label, model_name))
    LookupError: App 'members' doesn't have a 'account' model.
    

    это же чего, походу она его не увидела прямо в конфиге джанго, не доползая до формы?
    Потому как в форме то щас:

    
    class Meta:
       model = settings.AUTH_USER_MODEL  # get_user_model()
    

    Очень меня смущает вот эта строка в трейсе:
    return self.get_app_config(app_label).get_model(model_name.lower())
    app_label?
    В мете модели Account у меня стоит:
    app_label = 'account'

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 18 марта 2016 г. 2:57, спустя 1 минуту 20 секунд

    В мете модели Account у меня стоит:
    app_label = 'account'

    @john2dark, зачем это у тебя стоит? снеси нахуй это ненужно

    Спустя 5 сек.

    и да, возможно в этом проблема

    Сапожник без сапог
  • john2dark

    Сообщения: 99 Репутация: N Группа: Адекваты

    Spritz 18 марта 2016 г. 3:57, спустя 1 час 7 секунд

    Всё отлично отработало, заебись.
    С меня пиво, если будешь в Архангельске или в июне в Воронеже.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 18 марта 2016 г. 4:02, спустя 4 минуты 21 секунду

    @john2dark, к слову, если тебе надо app_label все еще, то тебе с учетом его и надо писать settings.AUTH_USER_MODEL

    то есть будет не 'members.xx', а 'account.xx'.

    app_label просто переименовывает app name ну он переименовал, а ты старое имя искал как б)

    Спустя 18 сек.

    @john2dark, врядли там появлюсь, пока в планах не было :)

    Сапожник без сапог
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 18 марта 2016 г. 5:52, спустя 1 час 49 минут 43 секунды

    @phpdude, ради пива то можно

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 18 марта 2016 г. 5:58, спустя 6 минут 53 секунды

    @phpdude, ради пива то можно

    @adw0rd, ну в принципе то да

    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!