Django-tastypie: Erreur : "class Meta n'a pas d'attribut 'object_class'"

Créé le 21 juil. 2016  ·  6Commentaires  ·  Source: django-tastypie/django-tastypie

Salut,

Lorsque j'ai mis à jour mon savoureux de 13.3 à la tête, essayer d'exécuter mon application Web renvoie cette erreur :

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 je reviens à la version 13.3 (commit a71dd6e85e18ec38e978e904c0c7a91dee11043d) alors cela fonctionne bien.

Une idée de ce qui ne va pas ?
Merci

bug unconfirmed

Commentaire le plus utile

@SeanHayes : Je viens de rencontrer ce même problème, car j'utilisais une ressource de base abstraite. Voici une reproduction :

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

Cela échoue avec la même trace de pile collée par hashemian, à la ligne class BaseResource(ModelResource): , car la BaseResource n'a pas de jeu de requêtes.

Ma solution de contournement pour l'instant est d'ajouter object_class = None à BaseResource.Meta , puis tout fonctionne.

Je pense que la solution actuelle consiste à changer la ligne resources.py 1797 en if meta and getattr(meta, 'object_class'):

... ou s'il est souhaitable que les sous-classes de ModelResource génèrent une erreur lorsque le jeu de requêtes n'est pas défini, cette erreur pourrait être plus explicite. Je ne pense pas que ma BaseResource devrait échouer, cependant, depuis lors, je ne sais pas comment faire ce que j'essaie de faire ici.

Merci!

Tous les 6 commentaires

Pourriez-vous publier vos ressources ?

dans mon urls.py, j'importe tastypie.api.Api puis j'importe mes ressources une par une. Il semble qu'il échoue dès qu'il essaie de charger la première ressource. Par exemple, c'est l'une des ressources, mais même si je commente celle-ci, elle plante sur la ressource suivante.

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

Je viens d'ajouter des tests de régression mais ils n'ont pas réussi à reproduire l'erreur : 3e1f5527b698c7121d4c5434d073b08d364d31f2

Plus d'infos que vous pourriez fournir? À quel point votre exemple de code est-il proche de votre code réel ?

Merci Sean d'avoir étudié cela. L'exemple de code est très similaire, et j'ai simplement changé les noms. Je vais vérifier à nouveau de mon côté et essayer de voir s'il y a un élément qui pourrait être pertinent et manquant.

Clôture, n'hésitez pas à commenter si vous avez plus d'infos.

@SeanHayes : Je viens de rencontrer ce même problème, car j'utilisais une ressource de base abstraite. Voici une reproduction :

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

Cela échoue avec la même trace de pile collée par hashemian, à la ligne class BaseResource(ModelResource): , car la BaseResource n'a pas de jeu de requêtes.

Ma solution de contournement pour l'instant est d'ajouter object_class = None à BaseResource.Meta , puis tout fonctionne.

Je pense que la solution actuelle consiste à changer la ligne resources.py 1797 en if meta and getattr(meta, 'object_class'):

... ou s'il est souhaitable que les sous-classes de ModelResource génèrent une erreur lorsque le jeu de requêtes n'est pas défini, cette erreur pourrait être plus explicite. Je ne pense pas que ma BaseResource devrait échouer, cependant, depuis lors, je ne sais pas comment faire ce que j'essaie de faire ici.

Merci!

Cette page vous a été utile?
0 / 5 - 0 notes