Usando el recurso tastypie a la vista

Mi primera pregunta aquí:

Así que estoy usando tastypie para tener API para mi aplicación.

Quiero poder usar tastypie para representar json y luego incluirlo en una vista de django para poder arrancar los datos de mi aplicación.

Aquí hay un ejemplo de esto en el libro de cocina django tastypie: http://django-tastypie.readthedocs.org/en/latest/cookbook.html#using-your-resource-in-regular-views

El problema es que NO PUEDO hacer que esto funcione, he intentado variantes de más simples a más complejas y simplemente no puedo hacerlo, aquí hay un código para mis modelos:

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

y mis recursos:

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

y mi índice de vista:

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

Lo que quiero es mi función renderOne () para darme el json de ONE ChatMessageResource Y también me gustaría una función renderAll () para darme TODO (o filtrado) ChatMessageResources en json.

Y quiero usar internos de tastypie, SÉ que podría serializarlo solo, pero ese no es el punto ..

En este momento el error es:

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

Me estoy volviendo loco, lo he intentado durante horas.

Así que, por favor, ¡cómo obtener UNO / TODO recurso como JSON por código usando tastypie en una vista de django!

Si no está claro o necesito aclarar, solo pregunte, gracias

Realmente, lo que quiero hacer es poder obtener el JSON devuelto por una URL de la API que creé, pero desde el código, no visitando la url. Entonces, si tengo /api/v1/messages/?chat_session=14 que regresa una lista de mensajes, quiero poder hacer lo mismo por código (y no por obtener la url con rizo o algo así, por favor).

Nota: la definición de ModelResource.obj_get de 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)  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).") 

Así que aquí encontré la solución, el problema era que la url se resolvía … Necesitaba agregar

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

al objeto relacionado (sesión aquí) para que funcione (¡no pregunte por qué!)

Así que aquí está mi solución de trabajo para renderDetail y renderList:

 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 

Y aquí hay un ejemplo de uso:

 cmr = ChatMessageResource() dataOne= cmr.renderDetail("723") dataAll = cmr.renderList({'limit':'0','chat_session':cur_sess.pk}) 

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

He encontrado que el método obj_get necesita un objeto de solicitud agrupada. Vea el enlace.

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

Tu problema parece estar aquí:

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

Los parámetros para obj_get deben ser kwargs que se pueden pasar directamente a un get estándar. None no debería estar allí.