Django-tastypie: Fehler: "Klasse Meta hat kein Attribut 'object_class'"

Erstellt am 21. Juli 2016  ·  6Kommentare  ·  Quelle: django-tastypie/django-tastypie

Hi,

Wenn ich meinen leckeren Kuchen von 13.3 auf den Kopf aktualisiert habe, wird beim Versuch, meine Webapp auszuführen, dieser Fehler ausgegeben:

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'

Wenn ich zurück zu Version 13.3 wechsle (commit a71dd6e85e18ec38e978e904c0c7a91dee11043d), dann funktioniert es einwandfrei.

Irgendeine Idee, was falsch sein könnte?
Vielen Dank

bug unconfirmed

Hilfreichster Kommentar

@SeanHayes : Ich bin gerade auf dasselbe Problem Basisressource verwendet habe. Hier eine Reproduktion:

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

Dies schlägt fehl, wenn der gleiche Stacktrace von hashemian in der Zeile class BaseResource(ModelResource): eingefügt wird, da die BaseResource keinen Abfragesatz hat.

Meine Problemumgehung besteht im Moment darin, object_class = None zu BaseResource.Meta hinzuzufügen, dann funktioniert alles.

Ich denke, die eigentliche Lösung besteht darin, die resource.py-Zeile 1797 in if meta and getattr(meta, 'object_class'): zu ändern

... oder wenn es wünschenswert ist, dass ModelResource-Unterklassen einen Fehler ausgeben, wenn queryset nicht festgelegt ist, dann könnte dieser Fehler expliziter sein. Ich denke jedoch nicht, dass meine BaseResource fehlschlagen sollte, da ich dann nicht sicher bin, wie ich das tun soll, was ich hier versuche.

Vielen Dank!

Alle 6 Kommentare

Könnten Sie Ihre Ressourcen posten?

in meiner urls.py importiere ich tastypie.api.Api und importiere dann meine Ressourcen einzeln. Es scheint, dass es fehlschlägt, sobald es versucht, die erste Ressource zu laden. Dies ist zum Beispiel eine der Ressourcen, aber selbst wenn ich diese auskommentiere, stürzt sie bei der nächsten Ressource ab.

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

Ich habe gerade Regressionstests hinzugefügt, aber sie konnten den Fehler nicht reproduzieren: 3e1f5527b698c7121d4c5434d073b08d364d31f2

Könnten Sie weitere Informationen liefern? Wie nah ist Ihr Codebeispiel an Ihrem tatsächlichen Code?

Danke Sean, dass du das untersucht hast. Der Beispielcode ist sehr ähnlich, und ich habe im Grunde nur die Namen geändert. Ich werde meinerseits noch einmal überprüfen und versuchen, zu sehen, ob ein Element vorhanden ist, das relevant sein könnte und fehlt.

Schließen, zögern Sie nicht zu kommentieren, wenn Sie weitere Informationen haben.

@SeanHayes : Ich bin gerade auf dasselbe Problem Basisressource verwendet habe. Hier eine Reproduktion:

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

Dies schlägt fehl, wenn der gleiche Stacktrace von hashemian in der Zeile class BaseResource(ModelResource): eingefügt wird, da die BaseResource keinen Abfragesatz hat.

Meine Problemumgehung besteht im Moment darin, object_class = None zu BaseResource.Meta hinzuzufügen, dann funktioniert alles.

Ich denke, die eigentliche Lösung besteht darin, die resource.py-Zeile 1797 in if meta and getattr(meta, 'object_class'): zu ändern

... oder wenn es wünschenswert ist, dass ModelResource-Unterklassen einen Fehler ausgeben, wenn queryset nicht festgelegt ist, dann könnte dieser Fehler expliziter sein. Ich denke jedoch nicht, dass meine BaseResource fehlschlagen sollte, da ich dann nicht sicher bin, wie ich das tun soll, was ich hier versuche.

Vielen Dank!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen