在restframework中添加对api返回字段的限制
django-returnfields的Python项目详细描述
在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
- 重写积极的实现