質問の詳細
下記のコードのようにAppConfig継承クラスにimport_modelsメソッドを定義して実行すると
下記結果の通りmodelクラスをインポートしただけで突然OrderedDictの値が格納されました。
AppConfig継承クラス(polls/apps.py)
from django.apps import AppConfig class PollsConfig(AppConfig): name = 'polls' def import_models(self): print('+'*20,'before_import','+'*20,self.apps.all_models[self.label]) from polls.core.models.users import Users print('+'*20,'after_import','+'*20,self.apps.all_models[self.label]) self.models = self.apps.all_models[self.label]
結果
prompt:~/environment/xxxxxx/dev $ python manage.py makemigrations polls ++++++++++++++++++++ before_import ++++++++++++++++++++ OrderedDict() ++++++++++++++++++++ after_import ++++++++++++++++++++ OrderedDict([('users_groups', <class 'polls.core.models.users.Users_groups'>), ('users_user_permissions', <class 'polls.core.models.users.Users_user_permissions'>), ('users', <class 'polls.core.models.users.Users'>)])
直前の呼び元のall_models(下記のモジュール Appsクラス:)も確認しましたが
特別な処理をしているようには見受けられませんでした。
django/apps/registry.py
一応この記述でもmigrationは通りましたが不適切な実装であるか非常に不安です。
makemigrationsを実行して偶然上手くいったというのが正直なところです。
どなたか次の2点について教えて頂けませんでしょうか。
1、なぜ、modelクラスをインポートしただけでOrderedDictの値が設定されるのか
2、この実装は適切なのか
以上宜しくお願いします。
仕様
python3.6
django 1.11.5
※modelクラスの配置は必ずpolls.core.models配下に格納する
補足
モジュールの配置図
├── dev │ ├── __init__.py │ ├── __pycache__ │ ├── settings.py ① │ ├── urls.py ② │ └── wsgi.py ├── manage.py └── polls ├── admin.py ├── apps.py ③ ├── __init__.py ④ ├── migrations │ └── __pycache__ ├── __pycache__ ├── urls.py ⑤ └── core ├── __init__.py ⑥ ├── models │ ├── __init__.py ⑦ │ ├── __pycache__ │ └── users.py ⑧ └── __pycache__ └── views
①dev/settings.py(抜粋)
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls.apps.PollsConfig', ] AUTH_USER_MODEL = 'polls.Users'
②dev/urls.py(抜粋)
urlpatterns = [ url(r'^polls/', include('polls.urls')), url(r'^admin/', admin.site.urls), ]
③polls/apps.py
from django.apps import AppConfig class PollsConfig(AppConfig): name = 'polls' def import_models(self): print('+'*20,'before_import','+'*20,self.apps.all_models[self.label]) from polls.core.models.users import Users print('+'*20,'after_import','+'*20,self.apps.all_models[self.label]) self.models = self.apps.all_models[self.label]
④polls/init.py
from polls import apps
⑤polls/urls.py(抜粋)
urlpatterns = [ ]
⑥polls/core/init.py
from polls.core import models
⑦polls/core/models/init.py
from polls.core.models import users
⑧polls/core/models/users.py
from django.db import models from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, UserManager from django.contrib.auth.validators import UnicodeUsernameValidator from django.utils import timezone from django.utils.translation import gettext_lazy as _ from django.core.mail import send_mail import uuid as uuid_lib from django.utils import timezone class Users(AbstractBaseUser, PermissionsMixin): uuid = models.UUIDField(default=uuid_lib.uuid4, primary_key=True, editable=False) username_validator = UnicodeUsernameValidator() username = models.CharField( _('username'), max_length=20, unique=True, help_text=_( 'Required. 20 characters or fewer. Letters, digits and @/./+/-/_ only.'), validators=[username_validator], error_messages={ 'unique': _("A user with that username already exists."), }, ) email = models.EmailField(_('email address'), max_length=20, unique=True, blank=True) is_superuser = models.BooleanField(verbose_name='superuser', default=True) is_staff = models.BooleanField(verbose_name='管理サイトアクセス権限', default=False) is_active = models.BooleanField(verbose_name='有効/無効', default=True) created_at = models.DateTimeField(default=timezone.now) registrant = models.CharField( max_length=20, verbose_name='登録者', default='system') USERNAME_FIELD = 'email' EMAIL_FIELD = 'email' REQUIRED_FIELDS = [ 'username'] objects = UserManager() class Meta: permissions = ( ("can_view", "Can see content"), ("can_add_service", "can_add_service"), ("can_edit_service", "can_edit_service"), ("can_delete_service", "can_delete_service"), ) verbose_name = _('users') app_label = 'polls' def get_full_name(self): # The user is identified by their email address return self.email def get_short_name(self): # The user is identified by their email address return self.email
回答1件
あなたの回答
tips
プレビュー