2011-10-17 21 views
6
yılında tastypie kaynak kullanma buraya

benim ilk soru: görünümde

yüzden uygulamam için API 's olması tastypie kullanıyorum.

Ben json işlemek için tastypie kullanabilmek için istiyorum ve daha sonra bir Django görünümünde benim uygulamasının verilerini önyükler, böylece o içerir. Burada Django tastypie yemek kitabı bunun bir örneğidir vardır

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

Sorun burada, ben daha basit daha karmaşık gelen varyantları denedim ve sadece onu almak, bu işe CAN NOT olmasıdır bazı benim modelleri için kod:

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="") 
    [...] 

ve benim kaynaklar:

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, 
     } 

ve benim bakış endeksi:

Benim istediğim
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)) 

bana BİR ChatMessageResource ait json vermek benim renderOne() fonksiyonudur Ve ayrıca bana TÜM (veya filtrelenmiş) json içinde ChatMessageResources gice bir renderAll() fonksiyonunu istiyorum.

Ve .. ben kendim serialize olabilir BİLMEK ama önemli olan bu değil, tastypie iç görün kullanmak

istiyorum Şu anda hatadır: Ben sadece deli alıyorum

NoReverseMatch at /live/ 

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

, Saatlerce çalışıyorum.

Peki, nasıl bir Django görünümünde tastypie kullanarak kod tarafından JSON olarak BİRİ/TÜM kaynak almak için lütfen!

net değil ya da sadece isteyin netleştirmek gerekirse, teşekkür

Gerçekten ne yapmak istiyorum JSON benim yarattığım bir API url tarafından döndürülen almak mümkün olmakla birlikte, koddan değil url'yi ziyaret ederek .. Yani bir mesaj listesi döndüren /api/v1/messages/?chat_session=14 varsa, aynı kodu kullanarak (ve url'yi curl veya herhangi bir şeyle getirerek değil) yapmak istiyorum.

Not: Bir standarda doğrudan geçirilebilir kwargs olmalıdır obj_get için

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

parametreleri: https://github.com/toastdriven/django-tastypie/blob/master/tastypie/resources.py den ModelResource.obj_get ait tanımı

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).") 

cevap

9

Yani burada ben ... Sorun url çözülmesi ile oldu, çözüm buldum ben çalışabilmesi için ilgili nesne (burada oturum) için

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

eklemek için gerekli (sormayın niye ya!)

Yani burada renderDetail ve renderList benim çalışma çözümdür:

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 

Aşağıda bir örnek kullanım şöyledir:

cmr = ChatMessageResource() 

dataOne= cmr.renderDetail("723") 

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

yukarıda ModelResource.obj_get kaynaklarını koymak .. değişmez ama bu daha kolay – dwarfy

+4

A olduğunu düşünüyorum Bunu yapmanın daha temiz yolu, URL'yi tersine çevirirken API adını belirtmek, örn. 'url = reverse ('api_dispatch_list', kwargs = {'resource_name': 'myresource', 'api_name': 'v1'})'. Bu, API kök URL'nizi veya sürüm numaranızı değiştirirseniz kodun çalışmaya devam edeceği anlamına gelir. –

+0

tamam teşekkürler, deneyeceğim ... – dwarfy

0

Sorununuz burada gibi görünüyor get. None orada olmamalıdır.

+0

onsuz çalıştı, ama neyse ben talep yaratma ve Tepki oluşturma atlamak biliyorum – dwarfy

2

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

buldum obj_get o yöntem bir isteği nesnesine ihtiyaç duyar. Bağlantıya bakın.

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) 
    .... 
İlgili konular