【问题标题】:must be of the form 'app_label.ModelName'." % model ValueError: Invalid model reference必须采用“app_label.ModelName”的形式。” % model ValueError: Invalid model reference
【发布时间】:2017-11-20 13:00:41
【问题描述】:

当我python3 manage.py makemigrations 时,出现以下错误:

...

  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/db/models/fields/related.py", line 348, in contribute_to_class
    lazy_related_operation(resolve_related_class, cls, self.remote_field.model, field=self)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/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 "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/db/models/fields/related.py", line 83, in <genexpr>
    model_keys = (make_model_tuple(m) for m in models)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/db/models/utils.py", line 23, in make_model_tuple
    "must be of the form 'app_label.ModelName'." % model
ValueError: Invalid model reference 'x.qiyun_admin_productconfig_cloudserver.HostType

但是,我的 HostType 模型路径是这样的:
x.qiyun_admin_productconfig_cloudserver.models.HostType

回溯减去其中的.models。我不知道为什么。

请注意,序列化器和视图(序列化器视图)在api 目录下。

和设置:

...
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PARENT_DIR = os.path.abspath(os.path.join(BASE_DIR, os.pardir))


sys.path.insert(0, BASE_DIR)
sys.path.insert(0, os.path.join(PARENT_DIR,'x'))
sys.path.insert(0, os.path.join(PARENT_DIR,'x'))
sys.path.insert(0, os.path.join(PARENT_DIR,'x'))
...

INSTALLED_APPS = [
    'django.contrib.admin',
     ....
    'x.qiyun_admin_useradminmanage',  #  
    'x.qiyun_admin_usergroups',  #  

    'x.qiyun_admin_productconfig_common', #  
    'x.qiyun_admin_productconfig_cloudserver',  #  

    'x.qiyun_admin_financialmanage_ordermanage', # 
    'x.qiyun_admin_financialmanage_financialmanage', 

编辑

我在同一个 models.py(x.qiyun_admin_productconfig_cloudserver.) 中有两个模型(AvailableArea, AddressRegion):

class AvailableArea(models.Model):
    name = models.CharField(max_length=8)
    addressregion = models.ForeignKey(AddressRegion, default=1, related_name='availableareas', on_delete=models.CASCADE)

    def __str__(self):
        return self.name
    def __unicode__(self):
        return self.name

class AddressRegion(models.Model):
    name = models.CharField(max_length=8)

    def __str__(self):
        return self.name
    def __unicode__(self):
        return self.name

你看,我还应该指定addressregion = models.ForeignKey('qiyun_admin_productconfig_cloudserver.AddressRegion',...)吗?

如果其他机型如果有ForeignKey引用AddressRegion,我也导入了。


【问题讨论】:

  • @Alasdair 查看我的编辑,我的朋友/。
  • @Alasdair 我的编辑可能会让你知道我的问题,我只想使用更多目录来对我的应用程序进行分组,让我的应用程序看起来井井有条,所以我关注了这个帖子:stackoverflow.com/questions/47323242/…。然后我得到了我的问题。

标签: python django


【解决方案1】:

同样的错误信息有一点不同的情况:

ValueError:模型引用“users.models.MyUser”无效。细绳 模型引用的格式必须为“app_label.ModelName”。

错误是我在MyUser 模型的路径中指定了models

AUTH_USER_MODEL = 'users.models.MyUser'

但我们不应该这样做,我们只需要指定包和型号名称即可

AUTH_USER_MODEL = 'users.MyUser'

错误消失了。

【讨论】:

  • 我遇到了同样的错误。我的模型位于用户文件夹下。 App->users->models->models.py 关于如何走这条路的任何迹象?
【解决方案2】:

我遇到了同样的问题,但通过将我的 python 包添加到 INSTALLED_APPS 解决了它,如下所示:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'scm',
'scm.staff'

] 有问题的包是 scm.staff

然后这样指定模型

AUTH_USER_MODEL='staff.Staff'

【讨论】:

    【解决方案3】:

    我也遇到了同样的错误。就我而言,我注意到当我在项目范围内重构模型的名称时,它会以一种不起作用的方式更改引用。

    我正在删除一些不相关的代码,但原始代码看起来像(注意这是在名为“blog”的应用程序中):

    #model
    class Category(models.Model):
        pass
    
    class Post(models.Model):
        categories = models.ManyToManyField('blog.Category', related_name='posts')
    

    我选择将 Category 重构为 Categorie 以在另一个页面上测试某些内容,它改变了行

    categories = models.ManyToManyField('blog.Category', related_name='posts')
    

    categories = models.ManyToManyField('blog.models.Categorie', related_name='posts')
    

    这与 django 喜欢的东西有冲突,如错误消息中所述

    String model references must be of the form 'app_label.ModelName'
    

    这是我唯一能找到问题的地方,但看起来 IDE (PyCharm) 试图提供帮助并产生了错误。

    【讨论】:

      【解决方案4】:

      在创建迁移文件时: 重命名模型后是否忘记删除旧迁移文件?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 1970-01-01
        • 2023-03-12
        • 2019-02-25
        • 2012-05-15
        • 2013-07-27
        • 2021-10-08
        相关资源
        最近更新 更多