使用视域资源 [英] Using tastypie resource in view
问题描述
我在这里的第一个问题:
my first question here :
所以我正在使用好吃的东西为我的应用添加api。
So I'm using tastypie to have api's for my app.
我希望能够使用tastypie来呈现json,然后将其包含在django视图中,以便我可以引导应用程序的数据。
I want to be able to use tastypie to render json and then include that in a django view so that I can bootstrap my app's data.
有一个例子在dummy的dummy食谱中: http:// django- tastypie.readthedocs.org/en/latest/cookbook.html#using-your-resource-in-regular-views
There is an example of this in django tastypie cookbook here : http://django-tastypie.readthedocs.org/en/latest/cookbook.html#using-your-resource-in-regular-views
问题是我无法为了使它起作用,我尝试了从简单到更复杂的变体,但我无法理解,这里是我的模型的一些代码:
The problem is that I CANNOT get this to work, I've tried variants from simpler to more complex and I just cant get it, here some code for my models :
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))
我想要的是我的renderOne()函数给我一个的json的MessageMessageResource
而且我还想要一个renderAll()函数给我所有(或过滤后的) )json中的ChatMessageResources。
What I want is my renderOne() function to give me the json of ONE ChatMessageResource And also I'd like a renderAll() function to gice me ALL (or filtered) ChatMessageResources in json.
而且我想使用tastypie内部结构,我知道我可以自己对其进行序列化,但这不是重点。
And I want to use tastypie internals, I KNOW i could serialize it by myself but that's not the point..
现在错误是:
NoReverseMatch at /live/
Reverse for 'api_dispatch_detail' with arguments '()' and keyword arguments '{'pk': 14L, 'resource_name': 'session'}' not found.
我只是疯了,我已经尝试了好几个小时。
I'm just getting crazy, I've been trying for hours.
所以,如何在django视图中使用密码通过代码使用JSON获取一个/全部资源!
So please, how to get ONE/ALL resource as JSON by code using tastypie in a django view !
如果不清楚或我需要澄清一下,请问一下,谢谢
If It's not clear or I need to clarify, please just ask, thanks
我真正想要做的是能够获取我创建的API url返回的JSON,但是可以从代码中获取,而不是通过访问URL来实现。所以,如果我有 / api / v1 / messages /?chat_session = 14
,它返回了消息列表,我希望能够
Really what I want to do is to be able to get the JSON returned by an API url I created, but from code, not by visiting the url .. So If I have /api/v1/messages/?chat_session=14
which return a list of messages, I want to be able to do the same by code (and not by fetching the url with curl or something please).
注意:
ModelResource.obj_get的定义来自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).")
推荐答案
所以我在这里在解决方案上,问题在于网址解析...我需要添加
So here I found the solution, the problem was with url resolving ... I needed to add
def get_resource_uri(self, bundle_or_obj):
return '/api/v1/%s/%s/' % (self._meta.resource_name,bundle_or_obj.obj.id)
到相关对象(此处为会话)以使其起作用(不要问为什么!)
to the related object (session here) in order for it to work (don't ask why!)
我对renderDetail和renderList的工作解决方案:
So here is my working solution for renderDetail and 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
这是一个示例用法:
cmr = ChatMessageResource()
dataOne= cmr.renderDetail("723")
dataAll = cmr.renderList({'limit':'0','chat_session':cur_sess.pk})
这篇关于使用视域资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!