休息框架“元组”对象没有属性“_meta”
Posted
技术标签:
【中文标题】休息框架“元组”对象没有属性“_meta”【英文标题】:restframework 'tuple' object has no attribute '_meta' 【发布时间】:2016-12-30 22:28:13 【问题描述】:Django 抛出下一个异常:
restframework 'tuple' 对象没有属性 '_meta'
型号
class BDetail(models.Model):
lat = models.FloatField(blank=True, null=True)
lng = models.FloatField(blank=True, null=True)
class Meta:
# managed = False
db_table = 'b_detail'
查看
from .models import BDetail
from .serializers import BDetailSerializer
from rest_framework import viewsets
class BDetailList(viewsets.ModelViewSet):
queryset = BDetail.objects.all()
serializer_class = BDetailSerializer
网址
from django.conf.urls import url, include
from bdetail import views
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'bdetail', views.BDetailList)
urlpatterns = [
url(r'^', include(router.urls), name='bdetail')
]
序列化器
from .models import BDetail
from rest_framework import serializers
class BDetailSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = BDetail,
fields = ('lat', 'lng')
环境:
请求方法:GET 请求网址:http://apiix.verinmuebles.dev/v1/bdetail/
追溯:
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/core/handlers/exception.py” 在内部 39. response = get_response(request)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/core/handlers/base.py” 在 _get_response 187. response = self.process_exception_by_middleware(e, request)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/core/handlers/base.py” 在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/views/decorators/csrf.py” 在wrapped_view 58. return view_func(*args, **kwargs)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/viewsets.py” 在视野中 87. return self.dispatch(request, *args, **kwargs)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py” 在调度中 474. 响应 = self.handle_exception(exc)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py” 在句柄异常中 434. self.raise_uncaught_exception(exc)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py” 在调度中 471. 响应 = 处理程序(请求,*args,**kwargs)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/mixins.py” 在列表中 45. return self.get_paginated_response(serializer.data)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” 在数据中 701. ret = super(ListSerializer, self).data
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” 在数据中 240. self._data = self.to_representation(self.instance)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” 在 to_representation 中 619. self.child.to_representation(item) for item in iterable
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” 在 to_representation 中 460.fields = self._readable_fields
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/utils/functional.py” 在得到 35. res = instance.dict[self.name] = self.func(instance)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” 在_可读字段中 354. self.fields.values()中的字段字段
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” 在领域 340.对于key,self.get_fields().items()中的值:
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” 在 get_fields 946. info = model_meta.get_field_info(model)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/utils/model_meta.py” 在 get_field_info 36. opts = model._meta.concrete_model._meta
异常类型:/v1/bdetail/ 处的 AttributeError 异常值: “元组”对象没有属性“_meta”
【问题讨论】:
【参考方案1】:,
在 BDetailSerializer
序列化程序中的 BDetail
模型名称之后。删除它,你的代码就可以工作了。
建议:在您的BDetailSerializer
序列化程序中继承serializers.ModelSerializer
而不是serializers.HyperlinkedModelSerializer
,即:
class BDetailSerializer(serializers.ModelSerializer):
class Meta:
model = BDetail
fields = ('lat', 'lng')
【讨论】:
更新了答案。它不起作用,因为您的BDetailSerializer
序列化程序中的 BDetail
模型名称后面有 ,
。
@MoinuddinQuadri,非常感谢您的敏锐眼光。 ',' 是我的问题,它弄乱了元组结构!马上!【参考方案2】:
只是想添加一个可能发生这种事情的潜在案例。如果您使用get_or_create
,请记住此方法返回一个元组,而不仅仅是对象。
举个例子:
book = Book.objects.get_or_create(pk=123)
serializer = BookSerializer(book, request.data)
if serializer.is_valid():
serializer.save() # <-- Right here you would get the same error
通过解包元组解决了问题:
book, created = Book.objects.get_or_create(pk=123)
# or this way if you do not need to know if it was created or not
book, _ = Book.objects.get_or_create(pk=123)
【讨论】:
对像我这样健忘的人很有用【参考方案3】:问题出在序列化器上,删除model = BDetail,
中的',',错误就会消失。您在那里所做的基本上是将 BDetail 转换为元组。
【讨论】:
【参考方案4】:使用get_or_create()方法代替get_object_or_404() 当您创建更新视图并在对象之后使用“, _”以避免“元组对象没有 _meta”。
像这样 对象 = ModelClass.objects.get(pk=123) 如果此 obj 为 None 将引发错误 反而: 用这个 : obj, _ = ModelClass.objects.get_or_create(pk=123) 该方法检查modelClass.pk中是否存在123获取它或者如果不存在123,则在表中创建一个123,保存然后获取它。
【讨论】:
以上是关于休息框架“元组”对象没有属性“_meta”的主要内容,如果未能解决你的问题,请参考以下文章
Django登录AttributeError:'AnonymousUser'对象没有属性'_meta'
Django Admin,无法分组:异常值:'dict' 对象没有属性'_meta'
AttributeError:类型对象“产品”没有属性“_meta”
Flask peewee AttributeError:“ModelSelect”对象没有属性“_meta”
为啥 pytest 在测试模型创建时会抛出“AttributeError:'NoneType'对象没有属性'_meta'”错误?
带有 RabbitMQ 的 Celery:AttributeError:“DisabledBackend”对象没有属性“_get_task_meta_for”