restframework 'tuple' объект не имеет атрибута _meta

Джанго бросает следующее исключение:

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

URLs

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(запрос)

Файл "/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(например, запрос)

Файл "/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. вернуть view_func(*args, **kwargs))

Файл "/var/www/verinmuebles/current/Env/api/local/lib/python2.7/site-packages/rest_framework/viewsets.py" в представлении 87. вернуть 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 = request (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) для элемента в итерируемом

Файл "/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" в get 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 для значения, значение в 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(модель)

Файл "/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

Тип исключения: AttributeError at /v1/bdetail/ Значение исключения: объект 'tuple' не имеет атрибута '_meta'

2 ответа

Решение

У вас есть , после имени BDetail модель в BDetailSerializer сериализатору. Удалите это, и ваш код будет работать.

Предложение: Наследовать serializers.ModelSerializer в вашем BDetailSerializer сериализатор вместо serializers.HyperlinkedModelSerializer т.е.

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

Просто хотел добавить потенциальный случай, когда такая вещь может произойти. Если вы используете 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)

Проблема в сериализаторе, удалите ',' в model = BDetail,и ошибка исчезнет. То, что вы там сделали, по сути было приведением BDetail как кортежа.

Используйте метод get_or_create() вместо get_object_or_404 () При создании представления обновления и используйте ", _" после объекта, чтобы избежать "объект кортежа не имеет _meta".

Как этот Obj = ModelClass.objects.get(pk=123) Этот obj вызовет ошибку, если вместо этого он равен None: Используйте это: obj, _ = ModelClass.objects.get_or_create(pk=123) Этот метод проверяет, существует ли 123 в modelClass.pk получить его или, если не существует 123, создать 123 в таблице, сохранить и затем получить.

Другие вопросы по тегам