Django-tastypie: Error: "la clase Meta no tiene atributo 'object_class'"

Creado en 21 jul. 2016  ·  6Comentarios  ·  Fuente: django-tastypie/django-tastypie

Hola,

Cuando actualicé mi deliciouspie de 13.3 a la cabeza, intentar ejecutar mi aplicación web arroja este error:

Request Method: GET
Request URL: http://192.168.0.104:8888/accounts/login/?next=/dashboard/

Django Version: 1.8.8
Python Version: 2.7.12
Installed Applications:
('longerusernameandemail',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'tastypie',
 'myapp',
 'widget_tweaks',
 'corsheaders')
Installed Middleware:
('corsheaders.middleware.CorsMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')

Traceback:
File "/home/user/anaconda2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  119.                 resolver_match = resolver.resolve(request.path_info)
File "/home/user/anaconda2/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve
  365.             for pattern in self.url_patterns:
File "/home/user/anaconda2/lib/python2.7/site-packages/django/core/urlresolvers.py" in url_patterns
  401.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/home/user/anaconda2/lib/python2.7/site-packages/django/core/urlresolvers.py" in urlconf_module
  395.             self._urlconf_module = import_module(self.urlconf_name)
File "/home/user/anaconda2/lib/python2.7/importlib/__init__.py" in import_module
  37.     __import__(name)
File "/home/user/webserver/myapp/urls.py" in <module>
  7. from myapp.api import UserResource
File "/home/user/webserver/myapp/api.py" in <module>
  303. class MyResource(ModelResource):
File "/home/user/anaconda2/lib/python2.7/site-packages/tastypie/resources.py" in __new__
  1797.             if meta and meta.object_class:

Exception Type: AttributeError at /accounts/login/
Exception Value: class Meta has no attribute 'object_class'

Si vuelvo a la versión 13.3 (confirmo a71dd6e85e18ec38e978e904c0c7a91dee11043d), entonces funciona bien.

¿Alguna idea de lo que podría estar mal?
Gracias

bug unconfirmed

Comentario más útil

@SeanHayes : Me acabo de encontrar con el mismo problema, porque estaba usando un recurso base abstracto. Aquí hay una reproducción:

class BaseResource(ModelResource):
    class Meta:
        authentication = DefaultAuthentication()

class FooResource(BaseResource):
    class Meta(BaseResource.Meta):
        resource_name = 'foo'
        queryset = Foo.objects.all()

class BarResource(BaseResource):
    class Meta(BaseResource.Meta):
        resource_name = 'bar'
        queryset = Bar.objects.all()

Esto falla con el mismo seguimiento de pila pegado por hashemian, en la línea class BaseResource(ModelResource): , porque BaseResource no tiene un conjunto de consultas.

Mi solución alternativa por ahora es agregar object_class = None a BaseResource.Meta , entonces todo funciona.

Creo que la solución real es cambiar la línea de resources.py 1797 a if meta and getattr(meta, 'object_class'):

... o si es un comportamiento deseable que las subclases de ModelResource arrojen un error cuando el conjunto de consultas no está configurado, entonces ese error podría ser más explícito. Sin embargo, no creo que mi BaseResource deba fallar, ya que entonces no estoy seguro de cómo hacer lo que estoy tratando de hacer aquí.

¡Gracias!

Todos 6 comentarios

¿Podrías publicar tus recursos?

en mi urls.py, importo tastypie.api.Api y luego importo mis recursos uno por uno. Parece que falla tan pronto como intenta cargar el primer recurso. Por ejemplo, este es uno de los recursos, pero incluso si comento este, se bloquea en el siguiente recurso.

class MyResource(ModelResource):
    class Meta:
        queryset = MyModel.objects.all()
        fields = ['my_field']
        allowed_methods = ['get']
        resource_name = 'my_resource'
        authentication = BasicAuthentication()
        include_resource_uri = False

Acabo de agregar pruebas de regresión pero no pudieron reproducir el error: 3e1f5527b698c7121d4c5434d073b08d364d31f2

¿Alguna información más que pueda proporcionar? ¿Qué tan cerca está su muestra de código a su código real?

Gracias Sean por investigar esto. El código de muestra es muy similar y básicamente cambié los nombres. Verificaré nuevamente por mi parte e intentaré ver si hay algún elemento que pueda ser relevante y faltante.

Cerrando, no dude en comentar si tiene más información.

@SeanHayes : Me acabo de encontrar con el mismo problema, porque estaba usando un recurso base abstracto. Aquí hay una reproducción:

class BaseResource(ModelResource):
    class Meta:
        authentication = DefaultAuthentication()

class FooResource(BaseResource):
    class Meta(BaseResource.Meta):
        resource_name = 'foo'
        queryset = Foo.objects.all()

class BarResource(BaseResource):
    class Meta(BaseResource.Meta):
        resource_name = 'bar'
        queryset = Bar.objects.all()

Esto falla con el mismo seguimiento de pila pegado por hashemian, en la línea class BaseResource(ModelResource): , porque BaseResource no tiene un conjunto de consultas.

Mi solución alternativa por ahora es agregar object_class = None a BaseResource.Meta , entonces todo funciona.

Creo que la solución real es cambiar la línea de resources.py 1797 a if meta and getattr(meta, 'object_class'):

... o si es un comportamiento deseable que las subclases de ModelResource arrojen un error cuando el conjunto de consultas no está configurado, entonces ese error podría ser más explícito. Sin embargo, no creo que mi BaseResource deba fallar, ya que entonces no estoy seguro de cómo hacer lo que estoy tratando de hacer aquí.

¡Gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones