2016-07-30 42 views
4

我試圖重寫get_bundle_detail_dataTastypie使用自定義detail_uri_name,不匹配的錯誤類型

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' 

隨着代碼foo = fields.CharField(attribute = 'modelA__variableOnModelA')行,我對資源MyResource設置變量foo,向全世界呼籲variableOnModelAmodelA的變量。這很好用。

但我試圖讓variableOnModelAMyResource標識符,這樣我可以做/api/v1/resource/bar/與變量foo設置爲bar以獲取詳細的MyResource

我遇到的問題是錯誤:Invalid resource lookup data provided (mismatched type).這個錯誤說的是什麼?

終極問題:如何使用foo作爲detail_uri_name

編輯 型號:

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' 

的url:

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'), 
] 

實際資源:

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

你能在你的模型和URL粘貼CONFIGS? –

回答

1

它看起來像你需要重寫detail_uri_kwargs你的資源。

我結束了這樣的事情:

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

這麼容易!你爲我節省了一堆時間。 – Tsangares