Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在视图中使用tastype资源_Python_Django_Rest_Tastypie - Fatal编程技术网

Python 在视图中使用tastype资源

Python 在视图中使用tastype资源,python,django,rest,tastypie,Python,Django,Rest,Tastypie,我的第一个问题是: 因此,我使用tastypie为我的应用程序提供api 我希望能够使用tastypie呈现json,然后将其包含在django视图中,这样我就可以引导我的应用程序的数据 django tastypie食谱中有一个例子: 问题是,我无法实现这一点,我尝试了从简单到复杂的变体,但我无法实现,下面是我的模型的一些代码: class ChatMessage(models.Model): content = models.TextField() added = mod

我的第一个问题是:

因此,我使用tastypie为我的应用程序提供api

我希望能够使用tastypie呈现json,然后将其包含在django视图中,这样我就可以引导我的应用程序的数据

django tastypie食谱中有一个例子:

问题是,我无法实现这一点,我尝试了从简单到复杂的变体,但我无法实现,下面是我的模型的一些代码:

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()函数为我提供一个ChatMessageResource的json 我还希望使用renderAll()函数以json格式为我提供所有(或过滤的)ChatMessageResources

我想使用tastypie内部,我知道我可以自己序列化它,但这不是重点

目前的错误是:

NoReverseMatch at /live/

Reverse for 'api_dispatch_detail' with arguments '()' and keyword arguments '{'pk': 14L, 'resource_name': 'session'}' not found.
我快疯了,我已经试了好几个小时了

所以,请告诉我,如何通过在django视图中使用tastypie的代码将一个/所有资源作为JSON获取

如果不清楚或者我需要澄清,请直接询问,谢谢

实际上,我想做的是能够从我创建的API url返回JSON,而不是访问url。。因此,如果我有返回消息列表的
/api/v1/messages/?chat\u session=14
,我希望能够通过代码实现同样的功能(而不是通过使用curl或其他方法获取url)

注: ModelResource.obj_的定义来自

def obj_get(self,request=None,**kwargs):
"""
特定于ORM的“obj_get”实现。
获取可选的``kwargs``,用于缩小要查找的查询范围
实例。
"""
尝试:
基本对象列表=自。获取对象列表(请求)。过滤器(**kwargs)
对象\u列表=自身。应用\u授权\u限制(请求、基本\u对象\u列表)
stringified_kwargs=','。连接([%s=%s”%(k,v)表示kwargs.items()中的k,v)
如果len(对象列表)1:
引发多个对象返回(“超过“%s”个匹配“%s”。%”(self.\u meta.object\u class.\u name\u,stringized\u kwargs))
返回对象列表[0]
除值错误外:
raise NotFound(“提供的资源查找数据无效(类型不匹配)。”

您的问题似乎在这里:

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

obj_get
的参数应该是kwargs,可以直接传递给标准的
get
<代码>无不应该在那里。

所以我在这里找到了解决方案,问题在于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的工作解决方案:

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

我发现,obj\u get方法需要一个绑定的请求对象。请参阅链接

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

我试着不用它,但它没有改变。。无论如何,我把ModelResource.obj_的源放在上面,我知道我可以绕过请求创建和响应创建,但我认为这是一种更简单的方法,在反转URL时指定API名称,例如
URL=reverse('API_dispatch_list',kwargs={resource_name':'myresource',API_name':'v1')
。这意味着,如果更改API根URL或版本号,代码将继续工作。
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)
    ....