必须采用' app_label.ModelName'的形式。" %model ValueError:无效的模型引用

时间:2017-11-20 13:00:42

标签: python django

当我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,我也导入它。

4 个答案:

答案 0 :(得分:4)

情况与相同的错误消息略有不同:

  

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

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

AUTH_USER_MODEL = 'users.models.MyUser'

但是我们不愿意,我们只需要指定包装和型号名称

AUTH_USER_MODEL = 'users.MyUser'

错误消失了。

答案 1 :(得分:1)

您的应用'旗云管理员后台.产品配置.qiyun_admin_productconfig_cloudserver'的{​​{3}}为'qiyun_admin_productconfig_cloudserver'(仅限最后一个组件)。

当您使用它来定义外键时,您应该使用标签,而不是应用程序的完整路径。

host_type = models.ForeignKey('qiyun_admin_productconfig_cloudserver.HostType', ...)

答案 2 :(得分:0)

我有同样的问题但通过将我的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 :(得分:0)

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

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

  buildConfigField("String", "API_BASE_URL", "https://x.x.x.com/v2/")

我选择将private V find(int startPos, String key, int stepNum) { Hashtable<V>.Pair currPair = arr[startPos]; while ((currPair != null) && !currPair.key.equals(key)) { stepNum++; int nextPos = getNextLocation(startPos, stepNum, key); currPair = arr[nextPos]; } return (currPair == null) ? null : currPair.value; } 重构为#model class Category(models.Model): pass class Post(models.Model): categories = models.ManyToManyField('blog.Category', related_name='posts') 以测试另一页上的内容,并更改了该行

Category

Categorie

如错误消息中所述,哪些与django的喜好冲突

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

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

相关问题