在文件MyApp/models/Artwork.py
中具有模型:
class Artwork(models.Model):
class Meta:
verbose_name = _('Artwork')
verbose_name_plural = _('Artworks')
def __init__(self, *args, **kwargs):
super(Artwork, self).__init__(*args, **kwargs)
objects = ArtworkManager()
文件中有一个操作:MyApp/functions/actions.py
from MyApp.models import Artwork
import pprint;
def lock_artwork(request, id):
pprint.pprint(Artwork)
try:
art = Artwork.objects.get(pk=id)
except ObjectDoesNotExist:
raise Http404()
在MyApp/models/__init__.py
中:
from .Artwork import Artwork
我好奇地发现模型中没有属性objects
。
Stacktrace:
web_1 | <module 'MyApp.models.Artwork' from '/app/MyApp/models/Artwork.py'>
web_1 | Internal Server Error: /en/artwork/lock/2/
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
web_1 | response = get_response(request)
web_1 | File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
web_1 | response = self.process_exception_by_middleware(e, request)
web_1 | File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
web_1 | response = wrapped_callback(request, *callback_args, **callback_kwargs)
web_1 | File "/app/MyApp/functions/actions.py", line 72, in lock_artwork
web_1 | art = Artwork.objects.get(pk=id)
web_1 | AttributeError: module 'MyApp.models.Artwork' has no attribute 'objects'
我很想念什么?
答案 0 :(得分:1)
为使Django的所有自动功能(迁移,模型加载等)正常工作,模型必须位于其应用程序models
的命名空间中!不管是普通模块还是程序包都没有关系。我们经常在应用程序的不同模块中分离模型的操作如下:
MyApp
models
__init__.py
artwork # not the name of any model inside it!
other
在__init__.py
内,从子模块中导入所有模型:
# __init__.py
from .artwork import Artwork
from .other import OtherModel, YetAnotherModel
这样,models.Artwork
解析为实际模型,并被django的所有内部魔法所吸收。现在,您也可以直接在代码中的任意位置导入Artwork
模型from MyApp.models
:
# e.g. some views.py
from MyApp.models import Artwork
请注意:一个文件中的10个模型并不多。如果存在明确的语义分隔并且没有循环引用(在这种情况下,您可以主张使用单独的应用程序),那么我只会进行拆分。如果文件中有数十个模型和数百行是一个问题,那么您可能想寻找一个更好的IDE;-)