2016-07-30 7 views
4

Ich versuche get_bundle_detail_dataTastypie mit benutzerdefinierten detail_uri_name, nicht übereinstimmen Typ Fehler

class MyResourse(ModelResource): 
    foo = fields.CharField(attribute = 'modelA__variableOnModelA') 
    def get_bundle_detail_data(self, bundle): 
     return bundle.obj.foo 
    class Meta: 
     resource_name='resource' 

Mit dem Codezeile foo = fields.CharField(attribute = 'modelA__variableOnModelA') außer Kraft zu setzen, ich bin Setzen der Variable foo auf die Ressource MyResource, auf eine Variable auf modelA genannt variableOnModelA. Das funktioniert nicly.

Aber ich versuche variableOnModelA seine die Kennung für MyResource zu machen, auf diese Weise ich /api/v1/resource/bar/ tun kann, die detaillierten MyResource mit dem variablen foo Satz bar zu bekommen.

Das Problem, das ich habe, ist der Fehler: Invalid resource lookup data provided (mismatched type). Was sagt dieser Fehler?

Ultimate Frage: Wie kann ich foo als detail_uri_name verwenden?

EDIT Modell:

class AgoraUser(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='agora_user') 
    class Meta: 
     db_table = 'agora_users' 

Urls:

full_api = Api(api_name='full') 
full_api.register(AgoraUserResourse()) 
urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^', include(full_api.urls)), 
    url(r'^', include(min_api.urls)), 
    url(r'^search/', include('haystack.urls')), 
    url(r'^accounts/login/$', auth_views.login, {'template_name': 'login.html'}, name='login'), 
] 

tatsächliche Ressource:

class AgoraUserResourse_min(ModelResource): 
    username = fields.CharField(attribute = 'user__username') 
    class Meta: 
     resource_name='user' 
     #detail_uri_name = 'user__username' 
     queryset = AgoraUser.objects.all() 
     allowed_methods = ['get', 'put', 'post'] 
     authentication = AgoraAuthentication() 
     authorization = AgoraAuthorization() 
    def get_bundle_detail_data(self, bundle): 
     return bundle.obj.username 
+0

Können Sie in Ihren Modellen und URL configs einfügen? –

Antwort

1

Es sieht aus wie Sie detail_uri_kwargs für Ihre Ressource außer Kraft setzen müssen.

gewickelt ich mit so etwas wie dies oben:

from tastypie import fields 
from tastypie.resources import ModelResource 
from tastypie.bundle import Bundle 

from .models import AgoraUser 


class AgoraUserResourse(ModelResource): 
    username = fields.CharField(attribute='user__username') 
    class Meta: 
     resource_name='user' 
     detail_uri_name = 'user__username' 
     queryset = AgoraUser.objects.all() 
     allowed_methods = ['get', 'put', 'post'] 
     # authentication = AgoraAuthentication() 
     # authorization = AgoraAuthorization() 

    def detail_uri_kwargs(self, bundle_or_obj): 
     if isinstance(bundle_or_obj, Bundle): 
      bundle_or_obj = bundle_or_obj.obj 

     return { 
      'user__username': bundle_or_obj.user.username 
     } 

    def get_bundle_detail_data(self, bundle): 
     return bundle.obj.username 
+0

SO EINFACH! Du hast mir eine Menge Zeit erspart. – Tsangares

Verwandte Themen