首页 > 解决方案 > Django AttributeError:类型对象“房间”没有属性“对象”

问题描述

尝试在模式中查询或添加任何数据时,我收到错误消息type object 'Rooms' has no attribute 'objects'。这是我所拥有的:

主页/models.py:

class Rooms(models.Model):
    room_no = models.AutoField(primary_key=True)
    room_name = models.TextField(max_length=40)

主页/url.py:

from django.urls import path
from .views import HomePage, EnergyGeneration, RoomPage

urlpatterns = [
    path('', HomePage.as_view(), name='homepage'),
    path('energy', EnergyGeneration.as_view(), name='energygeneration'),
    path('room/<int:room_no>/', RoomPage.as_view(), name='roompage'),
]

MainProjectApp/urls.py:

from django.contrib import admin
from django.urls import path, include
from .forms import UpdatedLoginView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('Home.url')),
    path('accounts/login/', UpdatedLoginView.as_view()),
    path('accounts/', include('django.contrib.auth.urls')),
]

主页/views.py:

from Home.models import Rooms, Plugs, PlugElectricityConsumption, EnergyGeneration, EnergyMode, Battery, PowerTransaction, PowerGeneration

class HomePage(TemplateView):
    template_name = 'home/index.html'

    def get(self, request, *args, **kwargs):
        rooms = Rooms.objects.all()
        ......
        ......
        return render(request, self.template_name)

这是错误的完整堆栈跟踪:

Traceback (most recent call last):
  File "E:\Uni\Year 3\Professional Development\Esteem_v2\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "E:\Uni\Year 3\Professional Development\Esteem_v2\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "E:\Uni\Year 3\Professional Development\Esteem_v2\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "E:\Uni\Year 3\Professional Development\Esteem_v2\venv\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "E:\Uni\Year 3\Professional Development\Esteem_v2\venv\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "E:\Uni\Year 3\Professional Development\Esteem_v2\Home\views.py", line 62, in get
    rooms = Rooms.objects.all()

Exception Type: AttributeError at /
Exception Value: type object 'Rooms' has no attribute 'objects'

如果我尝试从 Python 控制台查询这些模式,它可以工作:

from Home.models import Rooms
Rooms.objects.all()
<QuerySet [<Rooms: Rooms object (1)>]>

但在 Django 中却没有。我无法弄清楚发生了什么。

编辑

这是 print(type(Rooms)) 和 print(dir(Rooms)) 的结果:

<class 'type'>

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__mod
ule__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_allowed_methods', 'as_view', 'content_type', 'dis
patch', 'extra_context', 'get', 'get_context_data', 'get_template_names', 'http_method_names', 'http_method_not_allowed', 'options', 'render_to_response', 'response_class', 'setup', 'template_engine
', 'template_name']

标签: pythondjangodjango-modelsdjango-queryset

解决方案


考虑到您正在使用 TemplateView,您可能不想使用 get() 而不是覆盖 get_context_data

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['rooms'] = Rooms.objects.all()
    return context

推荐阅读