【发布时间】:2020-05-14 13:46:35
【问题描述】:
在文件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,这是一个奇怪的错误。
堆栈跟踪:
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'
我遗漏了什么明显的东西?
【问题讨论】:
-
您的模型不属于
MyApp/models/Artwork.py,但属于MyApp/models.py。然后您的导入实际上导入了该模型,而不是包含它的虚假模块。 -
@schwobaseggl 这不是一个好主意,我有 10 个模型,这会导致文件非常大。一切正常,但不是这个小东西。根据其他答案,将模型分成自己的文件是没有问题的。
-
@DanielW。可能重复或在此处回答:stackoverflow.com/a/5534251/12581324,请记住检查文档以获取该代码的较新版本,因为答案已经 5 岁了。
-
你应该改用这个
from MyApp.models.Artwork import Artwork -
你真正应该做的是保持你的模型独立和可读:从你的子模块中导入它们
models/__init__.py。在其他任何地方,直接从models导入它们。但是NOT 将子模块命名为与模型相同。这将导致名称冲突。
标签: python django django-models