Django 2.0,一级类视图,AttributeError:“str”对象没有属性“values”

2024-04-23 19:49:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django 2.0中创建了一个通用视图和序列化程序,这样我就不必重复我自己的工作,创建CRUD视图或序列化程序。在

我的视图.py我的API应用程序的文件

from rest_framework import generics, mixins
from rest_framework.serializers import ModelSerializer


class StandardListMixinCreateApiView(mixins.CreateModelMixin, generics.ListAPIView):
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class StandardRudApiView(generics.RetrieveUpdateDestroyAPIView):
    lookup_field = 'pk'

此函数用于设置每个已启用模型的serializer.Meta.model。 `cls参数是StandardApiViews之一。在

^{pr2}$

我的网址.py在

from django.urls import re_path
from .views import *
from django.contrib.auth.models import Group, Permission
from .models import *

app_name = "api"

生成CRUD视图的模型。在

ENABLEDMODELS = [
    Address,
    Group,
    Permission,
    Customer,
    Employee,
    Commission,
    BugReport,
    FeatureRequest,
]

APILISTVIEWS = [get_adapted_class(
    StandardListMixinCreateApiView,
    model) for model in ENABLEDMODELS]

APIRUDVIEWS = [get_adapted_class(
    StandardRudApiView,
    model) for model in ENABLEDMODELS]

将每个创建的ListView的url路由添加到urlpatterns

# List, create views
urlpatterns = [re_path(
    f'^(?i){class_view.model}/',
    class_view.as_view(),
    name=f'{class_view.model}-list') for class_view in APILISTVIEWS]

# Retrive, update, delete views
urlpatterns += [re_path(
    f'^(?i){class_view.model}/' + r'(?P<pk>\d+)',
    class_view.as_view(),
    name=f'{class_view.model}-rud') for class_view in APIRUDVIEWS]

错误消息

Environment:


Request Method: GET
Request URL: http://localhost:8000/api/address/

Django Version: 2.0.4
Python Version: 3.6.5
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'api']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py" in inner
35.             response = get_response(request)

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
158.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
156.                 response = response.render()

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\django\template\response.py" in render
106.             self.content = self.rendered_content

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\response.py" in rendered_content
72.         ret = renderer.render(self.data, accepted_media_type, context)

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\renderers.py" in render
724.         context = self.get_context(data, accepted_media_type, renderer_context)

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\renderers.py" in get_context
656.         raw_data_post_form = self.get_raw_data_form(data, view, 'POST', request)

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\renderers.py" in get_raw_data_form
572.                 data = serializer.data.copy()

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py" in data
560.         ret = super(Serializer, self).data

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py" in data
266.                 self._data = self.get_initial()

File "C:\Users\Steffen22\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py" in get_initial
413.             for field in self.fields.values()

Exception Type: AttributeError at /api/address/
Exception Value: 'str' object has no attribute 'values'

Tags: djangoinpyselfviewdatagetlocal
1条回答
网友
1楼 · 发布于 2024-04-23 19:49:59

我找到了一个重用我的标准REST视图、序列化程序并基于它们生成url的解决方案。在

“api公司/视图.py'

from rest_framework import generics, mixins
from rest_framework.serializers import ModelSerializer


class StandardListMixinCreateApiView(mixins.CreateModelMixin, generics.ListAPIView):
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class StandardRudApiView(generics.RetrieveUpdateDestroyAPIView):
    lookup_field = 'pk'


def get_adapted_class(cls, model_class, serializer_fields='__all__'):
    class AdaptedView(cls):
        model = model_class.__name__

我不得不重写get_serializer_class函数,而不是设置serializer_class属性。在

^{pr2}$

这些标准的api视图易于使用,您可以创建一个新的django模型并将model类添加到ENABLEDMODELS列表中

“api公司/网址.py'

from django.urls import re_path
from .views import *
from django.contrib.auth.models import Group, Permission
from .models import *

app_name = "api"

ENABLEDMODELS = [
    Address,
    Group,
    Permission,
    Customer,
    Employee,
    Commission,
    BugReport,
    FeatureRequest,
]

APILISTVIEWS = [get_adapted_class(
    StandardListMixinCreateApiView,
    model) for model in ENABLEDMODELS]

APIRUDVIEWS = [get_adapted_class(
    StandardRudApiView,
    model) for model in ENABLEDMODELS]

在2.0以下的Django版本中,path/re_-path方法称为url,如果您更改了该方法,它也可以在旧版本中使用。在

re_path方法用于Django 2.0中的regex路由

# List, create views
urlpatterns = [re_path(
    f'^(?i){class_view.model}/',
    class_view.as_view(),
    name=f'{class_view.model}-list') for class_view in APILISTVIEWS]

# Retrive, update, delete views
urlpatterns += [re_path(
    f'^(?i){class_view.model}/' + r'(?P<pk>\d+)',
    class_view.as_view(),
    name=f'{class_view.model}-rud') for class_view in APIRUDVIEWS]

相关问题 更多 >