关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
在一些特殊情况下需要使用自定义链接,自定义链接的用法可看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即可找到:
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。