AttributeError: 'property' 对象没有属性 'copy' - 尝试在 Django Rest 中获取对象列表时
Posted
技术标签:
【中文标题】AttributeError: \'property\' 对象没有属性 \'copy\' - 尝试在 Django Rest 中获取对象列表时【英文标题】:AttributeError: 'property' object has no attribute 'copy' - while trying to get object list in Django RestAttributeError: 'property' 对象没有属性 'copy' - 尝试在 Django Rest 中获取对象列表时 【发布时间】:2018-04-30 14:13:53 【问题描述】:为了练习我的 Django 技能,我尝试制作简单的模块,它应该或多或少像 Django 中的管理站点一样工作。它应该从应用程序中收集所有模型,列出它们并显示每个模型中的每个对象。我尝试做的是使用 Django Rest Framework。
这是我的意见.py。我有 2 个视图。 api_root 监听所有模型,但它也将 params-models_names 发送到另一个视图“model_view”。 ModelViewSet 应该列出来自特定模型的所有对象。
class ModelsViewSet(viewsets.ModelViewSet):
def get_serializer(self, *args, **kwargs):
serializer_name = 'model_nameSerializer'.format(
model_name=self.kwargs.get('name').split(".")[1]
)
return getattr(serializers, serializer_name)
def get_model(self):
"""methods return model based on name kwargs
:return:
"""
return apps.get_model(self.kwargs.get('name'))
def get_queryset(self):
return self.get_model().objects.all()
def get_object(self):
return self.get_model().objects.get(pk=self.kwargs.get('pk'))
@api_view(['GET'])
def api_root(request, format=None):
return Response([reverse(
viewname='model_view',
kwargs='name': i._meta.label) for i in apps.get_models()])
这是我的 serializers.py。在这个文件中,序列化程序类是动态构建的。每个类都是基于 django.apps 中的模型构建的。
from django.apps import apps
from rest_framework import serializers
from admin_site import serializers as m
from . import models
app_models = apps.get_models()
for item in app_models:
name = "Serializer".format(item.__name__)
class Meta(type):
model = item
fields = '__all__'
m.__dict__[name] = type(name, (serializers.ModelSerializer,), )
m.__dict__[name].__metaclass__ = Meta
最后是我的 my_app.urls.py 文件。我认为问题可能是 ModelSetView 没有使用 DefaultRouter() 注册,但另一方面我需要将参数传递给 urlpattern。我不知道
urlpatterns = [
url(r'^$', views.api_root),
url(r'^model/(?P<name>[\w\-\.]+)/$',
views.ModelsViewSet.as_view('get': 'list', 'put':'update'), name='model_view'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
当我在 api_root 上时一切都很好,我可以看到模型列表。但是当我添加到根 url /model/auth.User/ 我得到这个错误:
Traceback (most recent call last):
File "/home/wojjak/Projects/envs/taskenvv/lib/python3.6/site-
packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/home/wojjak/Projects/envs/taskenvv/lib/python3.6/site-
packages/django/core/handlers/base.py", line 217, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/wojjak/Projects/envs/taskenvv/lib/python3.6/site-
packages/django/core/handlers/base.py", line 215, in _get_response
response = response.render()
File "/home/wojjak/Projects/envs/taskenvv/lib/python3.6/site-
packages/django/template/response.py", line 107, in render
self.content = self.rendered_content
File "/home/wojjak/Projects/envs/taskenvv/lib/python3.6/site-
packages/rest_framework/response.py", line 72, in rendered_content
ret = renderer.render(self.data, accepted_media_type, context)
File "/home/wojjak/Projects/envs/taskenvv/lib/python3.6/site-
packages/rest_framework/renderers.py", line 716, in render
context = self.get_context(data, accepted_media_type,
renderer_context)
File "/home/wojjak/Projects/envs/taskenvv/lib/python3.6/site-
packages/rest_framework/renderers.py", line 650, in get_context
raw_data_put_form = self.get_raw_data_form(data, view, 'PUT',
request)
File "/home/wojjak/Projects/envs/taskenvv/lib/python3.6/site-
packages/rest_framework/renderers.py", line 565, in get_raw_data_form
data = serializer.data.copy()
AttributeError: 'property' object has no attribute 'copy'
任何线索我可以做些什么来完成我的任务并避免这个错误?
【问题讨论】:
【参考方案1】:覆盖get_serializer_class()
而不是get_serializer()
【讨论】:
以上是关于AttributeError: 'property' 对象没有属性 'copy' - 尝试在 Django Rest 中获取对象列表时的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError: 'property' 对象没有属性 'copy' - 尝试在 Django Rest 中获取对象列表时
在抽象基类中定义 @property.setter 会产生 AttributeError
AttributeError: ‘Rectangle‘ object has no property ‘normed‘ 解决方法 matplotlib绘图
AttributeError: ‘Rectangle‘ object has no property ‘normed‘ 解决方法 matplotlib绘图