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)