在restframework中添加对api返回字段的限制

django-returnfields的Python项目详细描述


https://travis-ci.org/podhmo/django-returnfields.svg

在restframework中添加对api返回字段的限制。

这是什么?

api的定义如下

request: GET /users/1/?format=json
status code: 200
response: {
  "id": 1,
  "url": "http://testserver/users/1/?format=json",
  "username": "foo",
  "email": "",
  "is_staff": false,
  "skills": [
    {
      "id": 1,
      "user": 1,
      "name": "magic"
    },
    {
      "id": 2,
      "user": 1,
      "name": "magik"
    }
  ]
}

如果传递return_fields选项,则过滤api的响应

request: GET /users/1/?format=json&return_fields=username,id
status code: 200
response: {
  "id": 1,
  "username": "foo"
}

并添加跳过字段选项,作为忽略字段处理。

request: GET /users/1/?format=json&return_fields=username,skills&skip_fields=skills__id,skills__user
status code: 200
response: {
  "username": "foo",
  "skills": [
    {
      "name": "magic"
    },
    {
      "name": "magik"
    }
  ]
}

如何使用?

使用django_returnfields.serializer_factory

fromrest_frameworkimportviewsetsfromdjango_returnfieldsimportserializer_factoryclassUserViewSet(viewsets.ModelViewSet):queryset=User.objects.all()serializer_class=serializer_factory(UserSerializer)

附录

如果使用aggressive选项请求,则django_returnfields会尝试使用Query.defer()Query.only()。 例如

GET /users/1/?format=json&return_fields=username,skills&skip_fields=skills__id,skills__user&aggressive=1

aggressive选项不仅使用defer和only,而且还使用半自动连接或预取(TODO:introduction)

示例

## modelsfromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportUserclassSkill(models.Model):name=models.CharField(max_length=255,default="",null=False)user=models.ForeignKey(User,null=False,related_name="skills")## serializersfromrest_frameworkimportserializersclassSkillSerializer(serializers.ModelSerializer):classMeta:model=Skillfields=('id','user','name')classUserSerializer(serializers.ModelSerializer):skills=SkillSerializer(many=True,read_only=True)classMeta:model=Userfields=('id','url','username','email','is_staff','skills')## viewsetsfromrest_frameworkimportviewsetsfromdjango_returnfieldsimportserializer_factoryclassUserViewSet(viewsets.ModelViewSet):queryset=User.objects.all()serializer_class=serializer_factory(UserSerializer)classSkillViewSet(viewsets.ModelViewSet):queryset=Skill.objects.all()serializer_class=serializer_factory(SkillSerializer)## routesrouter=routers.DefaultRouter()router.register(r'users',viewsets.UserViewSet)router.register(r'skills',viewsets.SkillViewSet)urlpatterns=[url(r'^api/',include(router.urls)),]

0.3.2

  • 简化
  • 错误修复,优化不使用序列化程序has many=False选项

0.3.1

  • django restframework字段的支持源选项

0.3

  • 重写积极的实现

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaMaven没有识别junit测试   正则表达式替换Java中字符串中的所有“(“and”)”   文件移动到另一台计算机时出现java错误“实例化servlet类”   服务器上的java服务   Spring数据JPA上的java嵌套@Transactional注释行为   eclipse中的Java Tomcat项目   java在Tomcat上部署web应用程序   如何解决“java.lang.IllegalStateException:ArrayAdapter要求资源ID为TextView”错误?   java在条形码上方添加文本,并使用烧烤更改字体大小   java与php基准测试   java使用正则表达式提取特定模式   java扫描器。findInLine()大量泄漏内存   java HTTP:差异请求属性和POST参数   返回空指针的Java方法?   java验证密码不包含名称中的3个以上连续字符   Java中带泛型的静态多态性   java在Android中获得最后一个已知位置   java为什么Groovy的Map比Array更具可伸缩性?   编码如何在Java中生成八进制字符串?   java Hibernate:使用单例会话写入日志(无刷新)