优化的可包含序列化程序字段。
djangorestframework-include-mixin的Python项目详细描述
django rest framework轻型可包含序列化程序字段
要求
- Python(2.7、3.4、3.5、3.6)
- Django REST Framework(>;=3.0)
用法
serializers.py
classGroupSerializer(SerializerIncludeMixin,ModelSerializer):@classproperty# django.utils.decoratorsdefextra_objects(cls):return{'users':UserSerializer(source='user_set',many=True),'active_users':UserSerializer(many=True),}classMeta:model=Groupfields=('id','name')
views.py
classGroupViewSet(QueryOptimizerMixin,ReadOnlyModelViewSet):""" Groups. list: Available includable objects: * users - all users; * active_users - only active users. """queryset=Group.objects.all()serializer_class=GroupSerializerselect_related={}prefetch_related={'users':'user_set','active_users':Prefetch(lookup='user_set',queryset=User.objects.filter(is_active=True),to_attr='active_users',),}
现在我们可以做到了:
client=APIClient()response=client.get(# GET /groups/?include[]=active_users'/groups/',data=[('include[]','active_users'),],)
这将只进行2次查询:
- 所有组
- 仅预取活动用户
文档
H2> RestyFraseWorkPixdioMyin。SerializerIncludeMixin < /H2>在任何序列化程序中用于自动替换和添加序列化程序字段。
extra_objects
类变量
key:str-来自get参数的值include[]
。
例如,profile
表示/users/?include[]=profile
。
value:序列化程序-任何字段序列化程序。
示例:
classUserSerializer(SerializerIncludeMixin,ModelSerializer):extra_objects={'profile':ProfileSerializer(),'groups':GroupSerializer(many=True),}classMeta:model=Userfields=('id','profile_id')
GET parameters | Result serializer fields |
---|---|
'id': IntegerField(), 'profile_id': IntegerField() | |
?include[]=profile | 'id': IntegerField(), 'profile': ProfileSerializer() |
?include[]=groups | 'id': IntegerField(), 'profile_id': IntegerField(), 'groups': GroupSerializer(many=True) |
?include[]=profile&include[]=groups | 'id': IntegerField(), 'profile': ProfileSerializer(), 'groups': GroupSerializer(many=True) |
注意:带/不带_id
的标准序列化程序字段将替换为extra_objects
中的字段。
对于?include[]=profile
:profile
和profile_id
将从extra_objects
替换为profile
。
用于ModelViewSet以优化数据库查询。
select_related
类变量
key:str-来自get参数的值include[]
。
value:str-可以传递给select相关(model manager function)的字段名。
prefetch_related
类变量
key:str-来自get参数的值include[]
。
value:union[str,prefetch]-可以传递给预取相关(model manager function)的字段名或预取对象。