当我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
,我也导入它。
答案 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)试图提供帮助并创建了错误。