tastypie自定义链接使用obj_create方法

  • 发布时间:2017年9月3日 01:07
  • 作者:杨仕航
  • 分类标签: Django
  • 阅读(7514)
  • 评论(0)

在一些特殊情况下需要使用自定义链接,自定义链接的用法可看tastypie自定义链接

在自定义链接中,如果我们通过Django的方法创建或修改对象需要写不少代码传入一些数据。这么处理会越过一些权限和字段判断等。可能会造成冗余重复的代码和隐患。既然在tastypie中,最好可以使用tastypie自带的obj_create和obj_update等方法。


如下Blog的model:

#coding:utf-8
from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()


由于某些特殊原因,不允许直接POST创建blog,需要通过自定义链接创建blog。好吧,我这是为了模拟情景。对应的Resource如下:

#coding:utf-8
from tastypie.resources import ModelResource
from .models import Blog

class BlogResource(ModelResource):
    class Meta:
        resource_name = "blog"
        queryset = Blog.objects.all()
        allowed_methods = ['get']
        
    def prepend_urls(self):
        urlpatterns = [
            url(r'^(?P<resource_name>%s)/publish/' % self._meta.resource_name,
                self.wrap_view('publish'))
        ]
        return urlpatterns
        
    def publish(self, request, **kwargs):
        # 只允许POST提交
        self.method_check(request, allowed=['post'])
        # 序列化提交的参数
        data = self.deserialize(request, 
            request.body, 
            format=request.META.get('CONTENT_TYPE', 'application/json'))
            
        # 创建对象
        blog = Blog()
        blog.title = data.get('title')
        blog.text = data.get('text')
        return self.create_response(request, {}, status=201)


大家可以看创建对象部分。也许只有两个字段,还不是很麻烦。若需要写入10几个字段,或者有很多个自定义链接需要创建对象。这时候会发现用Django的方法创建对象比较繁琐。

我查了tastypie的源码,发现有build_bundle方法创建bundle对象。有了bundle对象即可使用obj_create方法创建对象。打开tastypie的resources.py文件,搜索build_bundle即可找到:

20170903/20170903010100777.png


build_bundle方法可以传入3个参数request、data、obj。其中request是必须的,我们创建的数据是通过data获取,所以需要传入data。而obj可不用传入。修改BlogResource代码如下:

#coding:utf-8
from tastypie.resources import ModelResource
from tastypie.utils import dict_strip_unicode_keys
from .models import Blog

class BlogResource(ModelResource):
    class Meta:
        resource_name = "blog"
        queryset = Blog.objects.all()
        allowed_methods = ['get']
        
    def prepend_urls(self):
        urlpatterns = [
            url(r'^(?P<resource_name>%s)/publish/' % self._meta.resource_name,
                self.wrap_view('publish'))
        ]
        return urlpatterns
        
    def publish(self, request, **kwargs):
        # 只允许POST提交
        self.method_check(request, allowed=['post'])
        # 序列化提交的参数
        data = self.deserialize(request, 
            request.body, 
            format=request.META.get('CONTENT_TYPE', 'application/json'))
            
        # 创建对象
        bundle = self.build_bundle(data=dict_strip_unicode_keys(data), request=request)
        self.obj_create(bundle, **kwargs)
        return self.create_response(request, {}, status=201)

使用的时候提交具体的参数即可,这里需要post提交title和text参数。可实现使用obj_create创建对象。若你有兴趣,也可以试试obj_update。

上一篇:Apache反向代理处理js跨域问题

下一篇:tastypie自定义访问链接

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空