2016-07-30 35 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