tutorial framework create python django rest typeerror django-rest-framework

python - create - django rest framework serializer



TypeError durante el uso del tutorial django rest framework (5)

Soy nuevo en el uso del framework Django Rest, estoy siguiendo este tutorial Django-Rest-Framework

En lugar de fragmentos, mi modelo consiste en un perfil de usuario como se indica a continuación:

class UserProfile(models.Model): user = models.OneToOneField(User) emp_code = models.CharField(max_length=10, blank=True) user_type = models.IntegerField(max_length=1, default=0, choices=USER_TYPE) group = models.ForeignKey(Group, null=True, blank=True) status = models.SmallIntegerField(max_length=1,default=0) added_on = models.DateTimeField(auto_now_add=True)

La primera parte del tutorial funcionó bien, obtuvo el resultado deseado en formato json como se mencionó, sin embargo, el segundo tutorial en adelante obtengo un error de tipo:

TypeError at /authentication/userprofile/ ''type'' object is not iterable Request Method: GET Request URL: http://*****.com/authentication/userprofile/ Django Version: 1.6 Exception Type: TypeError Exception Value: ''type'' object is not iterable Exception Location: /home/web/cptm_venv/lib/python2.7/site- packages/rest_framework/views.py in get_permissions, line 226 Python Executable: /usr/bin/python Python Version: 2.7.3 Python Path: [''/home/web/cptm_venv/lib/python2.7/site-packages'', ''/home/web/cptm'', ''/home/web/cptm_venv/lib/python2.7/site-packages'', ''/usr/lib/python2.7'', ''/usr/lib/python2.7/plat-linux2'', ''/usr/lib/python2.7/lib-tk'', ''/usr/lib/python2.7/lib-old'', ''/usr/lib/python2.7/lib-dynload'', ''/usr/local/lib/python2.7/dist-packages'', ''/usr/lib/python2.7/dist-packages'', ''/usr/lib/pymodules/python2.7''] Server time: Wed, 11 Dec 2013 17:33:54 +0530 Traceback Switch to copy-and-paste view /home/web/cptm_venv/lib/python2.7/site-packages/django/core/handlers/base.py in get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ... ▶ Local vars /home/web/cptm_venv/lib/python2.7/site-packages/django/views/generic/base.py in view return self.dispatch(request, *args, **kwargs) ... ▶ Local vars /home/web/cptm_venv/lib/python2.7/site-packages/django/views/decorators/csrf.py in wrapped_view return view_func(*args, **kwargs) ... ▶ Local vars /home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in dispatch response = self.handle_exception(exc) ... ▶ Local vars /home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in dispatch self.initial(request, *args, **kwargs) ... ▶ Local vars /home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in initial self.check_permissions(request) ... ▶ Local vars /home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in check_permissions for permission in self.get_permissions(): ... ▶ Local vars /home/web/cptm_venv/lib/python2.7/site-packages/rest_framework/views.py in get_permissions return [permission() for permission in self.permission_classes] ... ▶ Local vars

El resto del código es casi el mismo que se da en el enlace de arriba en la segunda parte y la tercera parte: views.py

from apps.authentication.models import UserProfile from apps.authentication.serializers import UserProfileSerializer from rest_framework import mixins from rest_framework import generics class UserProfileList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView): queryset = UserProfile.objects.all() serializer_class = UserProfileSerializer def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.create(request, *args, **kwargs) class UserProfileDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView): queryset = UserProfile.objects.all() serializer_class = UserProfileSerializer def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs): return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs): return self.destroy(request, *args, **kwargs)

urls.py

from django.conf.urls import patterns, url from rest_framework.urlpatterns import format_suffix_patterns from apps.authentication import views urlpatterns = patterns('''', url(r''^userprofile/$'', views.UserProfileList.as_view()), url(r''^userprofile/(?P<pk>[0-9]+)/$'', views.UserProfileDetail.as_view()), ) urlpatterns = format_suffix_patterns(urlpatterns)

Me falta algo muy obvio, intenté mucho buscar qué significa exactamente el "tipo de objeto no iterable" en este contexto, y qué objeto está causando el problema, pero no tuve suerte. Estoy usando Django Rest Framework versión 2.3.

Gracias por adelantado


Como señaló Daniel arriba, tuve este estúpido fragmento en el archivo de configuración, que estaba causando el problema,

#REST_FRAMEWORK = { # ''''''Use hyperlinked styles by default'''''' # ''''''only used if serializer_class attribute is not set on a view'''''' # ''DEFAULT_MODEL_SERIALIZER_CLASS'': # ''rest_framkework.serializers.HyperLinkedModelSerializer'', # ''DEFAULT_PERMISSION_CLASSES'': # ''rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'' # }

Commmented esto y funcionó.


Para que otros lo supieran, seguí recibiendo el mismo error y descubrí que olvidé incluir una coma en mi REST_FRAMEWORK . Tenía esto:

''DEFAULT_PERMISSION_CLASSES'': ( ''rest_framework.permissions.IsAuthenticated'' ),

en lugar de esto:

''DEFAULT_PERMISSION_CLASSES'': ( ''rest_framework.permissions.IsAuthenticated'', ),

La coma define esto como una tupla de un elemento


Tuve el mismo error cuando utilicé permisos personalizados, debido a un ''error tipográfico''

Tuve:

@permission_classes(EventByFacilityPermissions) class EventByFacilityViewSet(viewsets.ModelViewSet):

en lugar de:

@permission_classes((EventByFacilityPermissions,)) class EventByFacilityViewSet(viewsets.ModelViewSet):


Pase la clase de autenticación dentro de su clase en lugar de su settings.py si necesita autenticación solo en algunas clases, y haga esto:

authentication_classes = [TokenAuthentication, ]

en lugar de esto:

authentication_classes = TokenAuthentication


En mi caso, el error tipográfico estaba en views.py . En lugar de ...

permission_classes = (permissions.IsAuthenticated,)

... Tuve ...

permission_classes = (permissions.IsAuthenticated)