Django 1.7-模型发现和应用配置以及自定义应用程序实验室

2024-10-04 01:29:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前正在使用Django==1.7.1。我有一些模块名称相同的可重用应用程序。这也使得模型的应用程序标签相同。这实际上是矛盾的。不能在不同的库中,在settings文件中的INSTALLED_APPS中使用两个同名的模块。在

我通过为模块添加AppConfig来解决这个问题,并更改了它们的标签(app_label)来解决冲突

#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',
    ...
]
...

现在,我可以将这些应用程序配置添加到我的INSTALLED_APPS中,而不是模块中。冲突才刚刚解决。在那之前一切都很好。在

这是我的问题;当我覆盖AppConfig的标签时,Django不会发现我在这些模块中的模型。当我奔跑时

^{pr2}$

似乎什么都没变。尽管我删除了所有迁移文件,但它甚至没有创建初始文件。我想,它看不到模型。每当我从我的应用程序配置中删除覆盖的标签字段时,这些模型就会再次被发现。所以,别以为我的模特位置不对。在

这也可能是虫子,我不知道。但如果我做错了什么,那会是什么呢?在

谢谢!在


Tags: 模块appsinstalled文件namepy模型应用程序
1条回答
网友
1楼 · 发布于 2024-10-04 01:29:58

我对Django代码的大部分内容进行了深入的回顾。应用程序中的模型如果在app config中定义了自定义app label,则不会由Django导入。这是因为,即使你在app config中更改了标签,models app_标签也不会更改。因此,Django认为,模型和定制的应用程序配置是针对不同的应用程序的。我认为,这是一个bug。在

django.apps.registry中,populate method中有几行是:

...
            # 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标签与app config标签相同的模型。这是导致问题的一个有问题的部分。{cd7>无论如何,改变模型是不够的。在

解决方案:

这是我的解决办法。在

我有一个抽象的应用程序配置,我所有的应用程序配置都将从中继承。在

^{pr2}$

这是一个不接触Django代码的解决方法。但是,我认为这个问题必须在Django解决。模型应用程序标签也应根据应用程序配置中定义的应用程序标签值进行更改。在

相关问题 更多 >