shell 中的错误:未声明显式 app_label 且不在 INSTALLED_APPS 中的应用程序中
Posted
技术标签:
【中文标题】shell 中的错误:未声明显式 app_label 且不在 INSTALLED_APPS 中的应用程序中【英文标题】:Error in shell: doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS 【发布时间】:2018-03-31 21:14:15 【问题描述】:我第一次尝试 Django。阅读“Django 1.11 的两勺”一书。伟大的阅读。只有脚本经验和 Python 新手,我正在尽最大努力遵循书籍标准。
使用“cookiecutter-django”启动的项目制作了一个带有 TimeStampedModel 的简单地址应用程序进行实验。
适用于 makemigrations、migrate、admin 和 runserver。没问题,它就像一个魅力。
但是,我想在 csv 导入和绑定到表单上尝试本书示例,但我想从 shell 运行它进行测试。
以下内容可能过于冗长,但我不确定如何继续。
python manage.py shell --settings=config.settings.local
导入所需代码时出现错误(任何其他形式或模型得到相同的结果):
In [1]: from address.forms import add_csv_postarea
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-1-f253686866ed> in <module>()
----> 1 from address.forms import add_csv_postarea
~/projects/myproject/myproject/address/forms.py in <module>()
5 from django import forms
6
----> 7 from .models import PostArea, Address
8
9
~/projects/myproject/myproject/address/models.py in <module>()
7
8
----> 9 class Country(TimeStampedModel):
10 """ ISO 3166 Country codes
11 https://en.wikipedia.org/wiki/ISO_3166-1
~/.virtualenvs/myproject/lib/python3.6/site-packages/django/db/models/base.py in __new__(cls, name, bases, attrs)
116 "Model class %s.%s doesn't declare an explicit "
117 "app_label and isn't in an application in "
--> 118 "INSTALLED_APPS." % (module, name)
119 )
120
RuntimeError: Model class address.models.Country doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
上面提到的模型还没有实现,但是如果我把模型注释掉,下一个模型 PostArea 也会有同样的问题。
这是我的相关设置:
配置/设置/base.py
...
# Apps specific for this project go here.
LOCAL_APPS = [
# custom users app
'myproject.users.apps.UsersConfig',
# Your stuff: custom apps go here
'myproject.core', # Containing the abstract class TimeStampedModel
'myproject.address', # including the address and PostArea models
]
...
配置/urls.py
urlpatterns = [
...
# Your stuff: custom urls includes go here
url(r'^address/', include('myproject.address.urls', namespace='address')),
我的项目/地址/forms.py
import csv
from django.utils.six import StringIO
from django import forms
from .models import PostArea, Address
class AddressForm(forms.ModelForm):
class Meta:
model = Address
fields = ['line1', 'line2', 'post_area']
class PostAreaForm(forms.ModelForm):
class Meta:
model = PostArea
fields = ['code', 'name']
def add_csv_postarea(rows):
""" Two Scoops of Django 1.11 - page 167
Importing Postal addresses from a CSV file
Data source: https://data.norge.no/data/posten-norge/postnummer-i-norge
"""
rows = StringIO(rows)
records_added = 0
errors = []
# Generate a dict per row, overriding the first CSV row missing keys
for row in csv.DictReader(rows, fieldnames=('code', 'name')):
# Bind the row to PostAreaForm
form = PostAreaForm(row)
# Check to see if the row is valid
if form.is_valid():
# Row data is valid so save the record.
form.save()
records_added += 1
else:
errors.append(form.errors)
return records_added, errors
我的项目/地址/models.py
import uuid as uuid_lib
from django.db import models
from django.urls import reverse
from core.models import TimeStampedModel
class Country(TimeStampedModel):
""" ISO 3166 Country codes
https://en.wikipedia.org/wiki/ISO_3166-1
"""
iso_2 = models.CharField(max_length=2, null=False)
iso_3 = models.CharField(max_length=3, null=False)
iso_numeric = models.CharField(max_length=3, null=False)
name_gb = models.CharField(max_length=30)
name_no = models.CharField(max_length=30)
def __str__(self):
return self.iso_2
class Meta:
verbose_name = "Country"
verbose_name_plural = "Countries"
class PostArea(TimeStampedModel):
""" Norwegian PostArea code and are
Foreign keys linking connected municipals
"""
code = models.CharField(max_length=12)
name = models.CharField(max_length=200)
def __str__(self):
return self.code
class Meta:
verbose_name = "Postal area"
verbose_name_plural = "Postal Areas"
class Address(TimeStampedModel):
""" Reusable Entities Addresses with relations to
- PostArea
- Country
"""
uuid = models.UUIDField(
primary_key=True,
default=uuid_lib.uuid4(),
editable=False
)
line1 = models.CharField(max_length=100)
line2 = models.CharField(max_length=100, blank=True)
post_area = models.ForeignKey(
PostArea,
on_delete=models.PROTECT,
null=True,
)
def __str__(self):
return self.line1
def post_name_callable(self):
return self.post_area.name
def get_absolute_url(self):
return reverse('address:detail', kwargs='pk': self.uuid)
class Meta:
verbose_name = "Address"
verbose_name_plural = "Addresses"
【问题讨论】:
您的导入似乎不一致。您同时拥有myproject.address
和from address.forms
。如果您在任何地方都使用myproject.address
,它可能会解决问题。
感谢 @Alasdair 在 shell 中使用 from myproject.address.forms import add_csv_postarea
解决了这个问题。我是新来的 - 我怎样才能给你学分?
@henningb 你只能给出答案。由于他是评论,因此您可以对此表示赞同。您也可以回答自己的问题并接受它,以便下一个出现的人可以轻松找到它。或者您可以要求 Alasdair 发表他的评论作为答案并接受该评论。
@henningb 我已将其添加为答案,如果它解决了您的问题,您可以接受它。
【参考方案1】:
在您的INSTALLED_APPS
中,您已包含myproject.address
。因此,您应该使用 myproject.address
而不是 address
进行导入。
例如,改变,
from address.forms import add_csv_postarea
到
from myproject.address.forms import add_csv_postarea
我不确定为什么您的项目布局允许您导入与 myproject
和 myproject.address
相同的模块。在 Django 的早期,这样做很容易导致奇怪的错误,但是在 Django 1.4 中更改了默认项目布局以避免这种方式。
【讨论】:
谢谢! @alasdair 我差点把头发拉出来。如此简单,但很难弄清楚:-)以上是关于shell 中的错误:未声明显式 app_label 且不在 INSTALLED_APPS 中的应用程序中的主要内容,如果未能解决你的问题,请参考以下文章
RuntimeError:模型类 xxx.xxx 未声明显式 app_label 且不在 INSTALLED_APPS 中的应用程序中
RuntimeError:模型类 myapp.models.class 未声明显式 app_label 并且不在 INSTALLED_APPS 中的应用程序中
RuntimeError:模型类 nose.util.C 未声明显式 app_label
RuntimeError:模型类 xxx 未声明显式 app_label 且不在 INSTALLED_APPS 中的应用程序中
RuntimeError:模型类 django.contrib.sites.models.Site 未声明显式 app_label 且不在 INSTALLED_APPS 中的应用程序中