Django无法识别模型中有对象

时间:2020-05-14 13:46:35

标签: python django django-models

在文件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'

我很想念什么?

1 个答案:

答案 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;-)

相关问题