2011-10-17 8 views
6

私の最初の質問はここに:ビューで肥沃なリソースを使用

私は私のアプリのためのAPIを持っているtastypieを使用しています。

私はtastypieを使ってjsonをレンダリングし、それをdjangoビューに含めて、私のアプリケーションのデータをブートストラップできるようにしたいと考えています。ここジャンゴtastypie料理で、この例があり

は:http://django-tastypie.readthedocs.org/en/latest/cookbook.html#using-your-resource-in-regular-views

問題は、私はここに、私は単純に、より複雑なのバリアントを試みたと私はちょうどカントはそれを得る、これは仕事を得ることができないということです私のモデルのためのいくつかのコード:

class ChatMessage(models.Model): 
    content = models.TextField() 
    added = models.DateTimeField(auto_now_add=True) 

    author = models.ForeignKey(ChatUser, related_name="messages") 
    chat_session = models.ForeignKey(ChatSession, related_name="messages") 
    answer_to = models.ForeignKey('self', blank=True, null=True) 

    flagged = models.BooleanField(blank=True,default=False) 
    mododeleted = models.BooleanField(blank=True,default=False) 
    mododeleted_by = models.ForeignKey(ChatUser,blank=True,null=True,default=None) 
    mododeleted_at = models.DateTimeField(blank=True,null=True,default=None) 
    [...] 

class ChatSession (models.Model): 
    title = models.CharField(max_length=200) 
    link_title = models.CharField(max_length=200) 
    description = tinymce_models.HTMLField() 
    date = models.DateTimeField() 
    online = models.BooleanField(default=False) 
    next_session = models.BooleanField(default=False) 
    meps = models.ManyToManyField(ChatMep) 
    uid_newsupdate = models.CharField(max_length=200,blank=True,null=True,default="") 
    [...] 

と私の資源:

class ChatMessageResource(MyModelResource): 
    chat_session = fields.ForeignKey(ChatSessionResource, 'chat_session') 

    def renderOne(self,request,pkval): 
     data = self.obj_get(None,pk=pkval) 
     dbundle = self.build_bundle(obj=data,request=request) 
     return self.serialize(None,self.full_dehydrate(dbundle),'application/json') 

    def dehydrate(self, bundle): 
     bundle.data['likes'] = bundle.obj.get_likes() 
     bundle.data['likes_count'] = len(bundle.data['likes']) 
     return bundle 

    class Meta: 
     authentication = Authentication() 
     authorization = Authorization() 
     queryset = ChatMessage.objects.all() 
     resource_name = 'message' 
     fields = ('content', 'added', 'flagged', 'mododeleted','author','answer_to','chat_session') 
     filtering = { 
      'chat_session': ALL_WITH_RELATIONS, 
     } 

と私の見解インデックス:

私が欲しいもの
def index(request): 

    cur_sess = get_current_chat_session() 

    data1= ChatMessageResource().renderOne(request,723) 

    return render_to_response('test.html', 
          { 
          'all_data' : data1 
          }, 
          context_instance=RequestContext(request)) 

は私ONE ChatMessageResource のJSONを与えるために私のrenderOne()関数であり、また、私は私ALL(またはフィルタリング)JSONでChatMessageResourcesをgiceするrenderAll()関数をしたいと思います。

と私は..私は、私は自分でそれをシリアライズする可能性が知っているが、それはポイントではありません、tastypie内部を使用する

をしたい今のエラーがある:私は夢中になっています

NoReverseMatch at /live/ 

Reverse for 'api_dispatch_detail' with arguments '()' and keyword arguments '{'pk': 14L, 'resource_name': 'session'}' not found. 

私は数時間努力してきました。

これで、djangoビューでtastypieを使用してコードでJSONとしてONE/ALLリソースを取得する方法を教えてください。

、ではないことがはっきりしていないか、私は明確にする必要がある場合は、ちょうど私が何をしたいのか本当に、感謝

を依頼するJSONは、私が作成したAPIのURLで返さ取得することができますが、コードからなることですしてくださいだから私は/api/v1/messages/?chat_session=14メッセージのリストを返す場合、私は同じコードを行うことができます(とカールか何かでURLをフェッチすることではない)したいです。

注:https://github.com/toastdriven/django-tastypie/blob/master/tastypie/resources.py

def obj_get(self, request=None, **kwargs): 
      """ 
    A ORM-specific implementation of ``obj_get``. 

    Takes optional ``kwargs``, which are used to narrow the query to find 
    the instance. 
    """ 
      try: 
       base_object_list = self.get_object_list(request).filter(**kwargs) 
       object_list = self.apply_authorization_limits(request, base_object_list) 
       stringified_kwargs = ', '.join(["%s=%s" % (k, v) for k, v in kwargs.items()]) 

       if len(object_list) <= 0: 
        raise self._meta.object_class.DoesNotExist("Couldn't find an instance of '%s' which matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs)) 
       elif len(object_list) > 1: 
        raise MultipleObjectsReturned("More than '%s' matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs)) 

       return object_list[0] 
      except ValueError: 
       raise NotFound("Invalid resource lookup data provided (mismatched type).") 

答えて

9

だからここに私が...問題はURLが解決した、解決策を見つけた私はそれを動作させるためには、関連するオブジェクト(ここではセッション)に

def get_resource_uri(self, bundle_or_obj): 
    return '/api/v1/%s/%s/' % (self._meta.resource_name,bundle_or_obj.obj.id) 

を追加するために必要な(要求しませんなぜ!だからここ)

はrenderDetailとrenderListのための私の実用的なソリューションです:私はobj_getことがわかってきました

cmr = ChatMessageResource() 

dataOne= cmr.renderDetail("723") 

dataAll = cmr.renderList({'limit':'0','chat_session':cur_sess.pk}) 
+0

上ModelResource.obj_getのソースを置きますこれを行うよりきれいな方法は、URLを逆転するときにAPI名を指定することです(例: 'url = reverse( 'api_dispatch_list'、kwargs = {'リソース名': 'myresource'、 'api_name': 'v1'})'。つまり、APIのルートURLまたはバージョン番号を変更すると、コードは引き続き機能します。 – dwarfy

+4

Aだと思う –

+0

ありがとう、私はしようとする... – dwarfy

0

からModelResource.obj_getの 定義あなたの問題はここにあると思われる:

data = self.obj_get(None,pk=pkval) 

obj_getにパラメータが標準に直接渡すことができkwargsからでなければなりませんgetNoneはそこにはいけません。

+0

私はそれなしで試してみましたが、それは変更されません...とにかく、私は私が私がリクエストの作成とレスポンスの作成をバイパスする可能性が知っているが、私は、これは簡単に – dwarfy

2

https://github.com/toastdriven/django-tastypie/issues/962

def renderDetail(self,pkval): 
    request = HttpRequest() 
    request.GET = {'format': 'json'} 
    resp = self.get_detail(request, pk=pkval) 
    return resp.content 


def renderList(self,options={}): 
    request = HttpRequest() 
    request.GET = {'format': 'json'} 
    if len(options) > 0: 
     request.GET.update(options) 

    resp = self.get_list(request) 
    return resp.content 

そして、ここでは使用例ですメソッドにはというオブジェクトが付属するオブジェクトが必要です。リンクを参照してください。

def user_detail(request, username): 
    ur = UserResource() 
    # Add this request bundle to the obj_get() method as shown. 
    req_bundle = ur.build_bundle(request=request) 
    user = ur.obj_get(req_bundle, username=username) 
    .... 
関連する問題