首页 文章

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

提问于
浏览
2

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请求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)File“ /var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/core/handlers/base.py“in _get_response 187. response = self.process_exception_by_middleware(e,request)File _get_response 185中的“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/core/handlers/base.py” . 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中 . 返回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)发送47中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py” 4. response = self.handle_exception(exc)handle_exception 434中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py”self.raise_uncaught_exception (exc)文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py”在dispatch 471中.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文件“/ var数据240中的/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py“ . self._data = self.to_representation(self.instance)文件”/ var / www / verinmuebles / current / Env / api / local / lib / python2.7 / site-packages / rest_framework / serializers.py“in to_representation 619.在to_representation 460中的可迭代文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py”中的项目的self.child.to_representation(item) . fields = self._readable_fields get 35中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/utils/functional.py”res = instance.dict [self.name] = self.func(instance)_readable_fields 354字段中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py”对于self.fields.values()中的字段,在字段340中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py”中输入密钥, self.get_fields() . items()中的值:get_fields 946中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/serializers.py” . = model_meta.get_field_info(model)File“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framewor get_field_info中的k / utils / model_meta.py“36 . opts = model._meta.concrete_model._meta异常类型:/ v1 / bdetail / Exception值中的AttributeError:'tuple'对象没有属性'_meta'

2 回答

  • 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
    

    通过解压缩元组来解决问题:

    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

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

    Suggestion :在 BDetailSerializer 序列化程序中继承 serializers.ModelSerializer 而不是 serializers.HyperlinkedModelSerializer ,即:

    class BDetailSerializer(serializers.ModelSerializer):
        class Meta:
            model = BDetail
            fields = ('lat', 'lng')
    

相关问题