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. response = self.handle_exception(exc)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py” 在handle_exception中 434. self.raise_uncaught_exception(exc)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py” 在发货 471. response = handler(request,* args,** kwargs)
文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/mixins.py” 在列表中 45.返回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 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” 在_readable_fields中 354. self.fields.values()
中字段的字段文件 “/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” 在田野里 340. for 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 / Exception值中的AttributeError: 'tuple'对象没有属性'_meta'
答案 0 :(得分:7)
,
序列化程序中BDetail
模型的名称后面有BDetailSerializer
。删除它,您的代码将起作用。
建议:在serializers.ModelSerializer
序列化程序中继承BDetailSerializer
而不是serializers.HyperlinkedModelSerializer
,即:
class BDetailSerializer(serializers.ModelSerializer):
class Meta:
model = BDetail
fields = ('lat', 'lng')
答案 1 :(得分:4)
只是想添加一个可能发生这种事情的潜在案例。如果您使用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)
答案 2 :(得分:0)
问题出在串行器上,删除model = BDetail,
中的',',错误将消失。您在那里所做的基本上是将BDetail强制转换为元组。
答案 3 :(得分:0)
使用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,保存并获取。