古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。

Django rest framwork 小技巧总结

Python admin 109℃ 0评论

不得不说Django Rest FrameWork使用还是很方便的,但是在日常中,经常遇到一些小问题让人头痛,索性专门开个文章,来一一记录日常遇到的一些问题和解决方法:

serializer的字符串数组问题

在Django中,如果你的Model有一个ForeignKey的关联,并且你在Api做查询时将这个关联以prefetch_related形式全部查询出来了,最典型的就是图集,举例如下:

在model中定义:

在Api中:

这是通常的作坊,将ForeignKey的关联对象全部转换到主对象的json里面去,对应会生成的json就像这样:

通常来说,这样就已经已经可以使用了,但是如果pic只是传一个图片地址的话,为什么不直接通过json的数组传递过来,还要通过数组-对象的形式传递呢。
通过查找Rest FrameWork,发现可以改写ModelASerializer为:

这样,pics序列化出来就不是数组-对象而变成了数组,同时将使用对象的 unicode 方法。 之后json会变为:

Token的失效问题

在Rest FrameWork中,TokenAuthentication是通过数据库表来存储的。 同时,它只记录了Token,Created, 如果,我们需要给一个Token设置过期时间,可以这样办:

同时,在setting中配置:

这样,在每次请求过来之后,就能够去刷新token的时间,并保证过期的token不被认证。 当然, 以上代码也可以改造成使用redis的方式。

prefetch_related的条件搜索

当使用prefetch_related时,Django默认是进行了所有关联对象的取出操作,以一个相册为例:

当需要筛选出author为Davey Jones的所有图片时,一般使用

此时,如果需要筛选出所有有效的图片,一般不得不进行一次循环或者表推导。
当Django版本大于1.7时,有一个推荐的对象Prefetch,进行如下搜索

APIView中进行分页

如果使用generics.ListAPIView进行分页,详细很多人都应该知道直接实现对应的get_queryset方法以及实现对应的Serializer对象就可以了。但是如果要使用APIView呢?首先,实现一个类:

这样,就可以在使用APIView对结果进行分页处理

转载请注明:北凉柿子 » Django rest framwork 小技巧总结

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址