restframework'tuple'对象没有属性'_meta'

cri*_*ego 4 python django python-2.7 django-rest-framework django-rest-framework-gis

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'
Run Code Online (Sandbox Code Playgroud)

视图

from .models import BDetail
from .serializers import BDetailSerializer
from rest_framework import viewsets

class BDetailList(viewsets.ModelViewSet):
        queryset = BDetail.objects.all()
        serializer_class = BDetailSerializer
Run Code Online (Sandbox Code Playgroud)

网址

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')
]
Run Code Online (Sandbox Code Playgroud)

串行

from .models import BDetail
from rest_framework import serializers

class BDetailSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = BDetail,
        fields = ('lat', 'lng')
Run Code Online (Sandbox Code Playgroud)

环境:

请求方法:GET请求URL: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 )

_get_response中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/core/handlers/base.py"185. response = wrapped_callback(request,*callback_args,**callback_kwargs)

在wrapped_view 58中输入文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/views/decorators/csrf.py".返回view_func(*args,**kwargs )

在视图87中输入文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/viewsets.py".返回self.dispatch(request,*args,**kwargs )

发送474中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py".response = self.handle_exception(exc)

handle_exception中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py"434.self.raise_uncaught_exception(exc)

发送471中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py".response = handler(request,*args,**kwargs)

列表45中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/mixins.py"返回self.get_paginated_response(serializer.data)

数据701中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py".ret = super(ListSerializer,self).data

在数据240中输入文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py".self._data = self.to_representation(self.instance)

to_representation 619中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py".可迭代项目的self.child.to_representation(item)

在to_representation 460中输入文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py".fields = self._readable_fields

get 35. res = instance中输入文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/utils/functional.py" .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()中的字段

在字段340中输入文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py".对于self.get_fields().中的键值,项目( ):

get_fields 946中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py".info = model_meta.get_field_info(model)

get_field_info中的文件"/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/utils/model_meta.py"36. opts = model._meta.concrete_model._meta

异常类型:/ v1/bdetail/Exception中的AttributeError值:'tuple'对象没有属性'_meta'

Moi*_*dri 10

您正在使用序列化程序中,BDetail模型名称BDetailSerializer.删除它,你的代码将工作.

建议:serializers.ModelSerializerBDetailSerializer序列化程序中继承而不是serializers.HyperlinkedModelSerializerie:

class BDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = BDetail
        fields = ('lat', 'lng')
Run Code Online (Sandbox Code Playgroud)


TGO*_*TGO 6

只是想添加一个可能发生这种情况的潜在案例。如果使用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 
Run Code Online (Sandbox Code Playgroud)

通过拆开元组可解决此问题:

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)
Run Code Online (Sandbox Code Playgroud)