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

时间:2016-08-23 23:33:06

标签: 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'

查看

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'

4 个答案:

答案 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,保存并获取。