7

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/

追溯:

内部 39 中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/core/handlers/exception.py”。 response = get_response(request)

_get_response 187 中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/core/handlers/base.py”。响应 = self.process_exception_by_middleware(e,请求)

_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)

Wrapped_view 中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/django/views/decorators/csrf.py” 58. return view_func(*args, **kwargs )

视图 87 中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/viewsets.py”。 return self.dispatch(request, *args, **kwargs )

调度 474 中的文件“/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/views.py”。响应 = 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)

调度 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

获取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”。 info = model_meta.get_field_info(model)

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

异常类型:/v1/bdetail/ 处的 AttributeError 异常值:“元组”对象没有属性“_meta”

4

4 回答 4

18

您在序列化程序中具有模型,名称之后。删除它,您的代码将起作用。BDetailBDetailSerializer

建议:继承serializers.ModelSerializer您的BDetailSerializer序列化程序而不是serializers.HyperlinkedModelSerializerie:

class BDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = BDetail
        fields = ('lat', 'lng')
于 2016-08-23T23:43:32.813 回答
16

只是想添加一个可能发生这种事情的潜在案例。如果您正在使用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)
于 2017-02-04T19:15:49.863 回答
0

使用 get_or_create() 方法而不是 get_object_or_404 () 当您创建更新视图并在对象后使用“,_”以避免“元组对象没有 _meta”。

像这样 Obj = ModelClass.objects.get(pk=123) 如果它是 None ,这个 obj 将引发错误:使用这个: obj, _ = ModelClass.objects.get_or_create(pk=123) 这个方法检查 modelClass 中是否存在 123 .pk 获取或者如果不存在123,在表中创建一个123,保存后再获取。

于 2019-12-07T12:35:38.657 回答
0

问题出在序列化程序上,删除',',model = BDetail,错误就会消失。您在那里所做的基本上是将 BDetail 转换为元组。

于 2019-08-27T00:02:12.897 回答