Python Django 1.7-使用自定义应用程序标签进行模型发现和应用程序配置
我目前使用的是Python Django 1.7-使用自定义应用程序标签进行模型发现和应用程序配置,python,django,django-1.7,django-migrations,Python,Django,Django 1.7,Django Migrations,我目前使用的是Django==1.7.1。我有一些具有相同模块名称的可重用应用程序。这也使得模型的应用程序标签相同。这实际上是相互矛盾的。您不能在不同的库中,在您的设置文件中的已安装的应用程序中使用同名的两个模块 我通过为模块添加一个AppConfig解决了这个问题,并更改了它们的标签(app_标签)以解决冲突 #librarayX.my_module.apps.py from django.apps import AppConfig class ModuleAppConfig(AppCon
Django==1.7.1
。我有一些具有相同模块名称的可重用应用程序。这也使得模型的应用程序标签相同。这实际上是相互矛盾的。您不能在不同的库中,在您的设置文件中的已安装的应用程序中使用同名的两个模块
我通过为模块添加一个AppConfig
解决了这个问题,并更改了它们的标签(app_标签)以解决冲突
#librarayX.my_module.apps.py
from django.apps import AppConfig
class ModuleAppConfig(AppConfig):
name = 'libraryX.my_module'
label = "X_my_module"
verbose_name = "my_module"
#librarayY.my_module.apps.py
from django.apps import AppConfig
class ModuleAppConfig(AppConfig):
name = 'libraryY.my_module'
label = "Y_my_module"
verbose_name = "my_module"
#settings.py
....
INSTALLED_APPS=[
...
'libraryX.my_module.apps.ModuleAppConfig',
'libraryY.my_module.apps.ModuleAppConfig',
...
]
...
现在,我可以将这些应用程序配置添加到我安装的应用程序中,而不是模块中。冲突刚刚解决。在那之前一切都很好
这是我的问题;当我覆盖AppConfig
的标签时,该模块中的模型不会被Django
发现。当我跑的时候
python manage.py makemigrations
似乎什么都没有改变。尽管我删除了所有迁移文件,但它甚至没有创建初始文件。我认为,它没有看到模型。每当我从我的应用程序配置中删除覆盖的标签字段时,这些模型就会再次被发现。所以,不要认为我的模型位置错了
这也可能是虫子,我不知道。但如果我做错了什么,那会是什么呢
谢谢 我深入地重温了《Django》的大部分内容。Django
不会导入问题中给出的应用程序配置中定义了自定义应用程序标签的应用程序中的模型。这是因为,即使您在应用程序配置中更改了标签,模型应用程序标签也不会更改。因此,Django认为,模型和自定义应用程序配置适用于不同的应用程序。我想,这是一个bug
在django.apps.registry
中,在populate方法
中有几行:
...
# Load models.
for app_config in self.app_configs.values():
all_models = self.all_models[app_config.label]
app_config.import_models(all_models)
...
此部件还应导入app_config.name
中定义的模块中的模型,而不仅仅是app_config.label
。因为,不会有应用标签与应用配置标签相同的模型。这是导致问题的问题部分之一。这还不够,还需要以某种方式更改型号app\u标签
解决方案:
这是我的解决办法
我有一个抽象的应用程序配置,我的所有应用程序配置都将从中继承
from collections import OrderedDict
from django.apps import AppConfig, apps
class BaseAppConfig(AppConfig):
def __init__(self, *args, **kwargs):
super(BaseAppConfig, self).__init__(*args, **kwargs)
# Also import the models in modules defined in self.name
mod_path, _, cls_name = self.name.rpartition('.')
self.import_models(OrderedDict([(k, v) for k, v in apps.all_models[cls_name].iteritems() if self.name in v.__module__]))
def import_models(self, all_models):
if not self.models:
# Set the model app_labels as self.label
for m in all_models.values():
m._meta.app_label = self.label
super(BaseAppConfig, self).import_models(all_models)
这是一种避免接触Django代码的解决方法。但是,我认为这个问题必须在Django解决。模型app_标签也应根据app config中定义的app_标签值进行更改。如果您认为这是一个bug,请在django bug跟踪器上记录:有几个人正在积极修复迁移bug,或者,他们可能会向您指出受支持的解决方案。您确定该问题仅在您更改应用程序标签时出现吗?通常在Django 1.7中,如果您删除某个应用程序的所有迁移(以及迁移目录),Django不会为该应用程序创建新的迁移目录,除非您明确给出其标签,例如,python manage.py makemigrations Y_my_module
,因此,我确信,python manage.py makemigrations
不会为没有任何.yes的应用程序创建初始迁移。即使我使用新的app_标签运行它,它也会说,在app'.'中未检测到任何更改。
。当我进行了一些迁移,并覆盖了标签
,它还会创建一个迁移文件,删除我的所有模型。我确信,它不会导入模型。我也在我的回答中描述了请看。可能与1.8+的用户相关,我现在没有时间检查此分析,但您愿意将其作为bug提交到吗?如果您可以编写一个请求,在Django的测试套件中添加一个测试来演示错误,那就更好了。好的,我将创建一个记录单,并在找到时间后尝试修补它。嗨,Ahmet-您是否为这个问题创建过记录单?Hello@CarlMeyer,很遗憾,我没有。我本打算在看到你最后的评论并记住后打开它。但是我现在试过了,我无法用所有django 1.7
版本(0,1,2,3,4)的简单示例再次重现这种情况。我将检查我的真实项目中有问题的部分,并很快在那里进行测试,并将根据该结果打开票据。