drf动态字段mixins

This commit is contained in:
caoqianming 2022-01-24 15:38:52 +08:00
parent eaa6da6a4f
commit ceb0fe2354
3 changed files with 16 additions and 13 deletions

View File

@ -3,9 +3,11 @@ from .models import User
class UserFilter(filters.FilterSet):
name = filters.CharFilter(field_name='name', lookup_expr='contains')
fields = filters.CharFilter(method='filter_fields')
class Meta:
model = User
fields = {
'name': ['exact', 'contains'],
'is_active': ['exact'],
}
fields = ['name', 'is_active', 'fields']
def filter_fields(self, queryset, name, value):
return queryset

View File

@ -5,6 +5,7 @@ from rest_framework import serializers
from .models import (Dict, DictType, File, Organization, Permission, Position,
Role, User)
from utils.mixins import DynamicFieldsMixin
class IntervalSerializer(serializers.ModelSerializer):
class Meta:
@ -132,7 +133,7 @@ class UserSimpleSerializer(serializers.ModelSerializer):
# fields = ['id', 'username', 'name', 'is_active', 'dept_name', 'dept']
class UserListSerializer(serializers.ModelSerializer):
class UserListSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
"""
用户列表序列化
"""

View File

@ -1,9 +1,9 @@
"""
Mixin to dynamically select only a subset of fields per DRF resource.
"""
import warnings
# import warnings
from django.conf import settings
# from django.conf import settings
class DynamicFieldsMixin(object):
@ -36,10 +36,10 @@ class DynamicFieldsMixin(object):
try:
request = self.context['request']
except KeyError:
conf = getattr(settings, 'DRF_DYNAMIC_FIELDS', {})
if not conf.get('SUPPRESS_CONTEXT_WARNING', False) is True:
warnings.warn('Context does not have access to request. '
'See README for more information.')
# conf = getattr(settings, 'DRF_DYNAMIC_FIELDS', {})
# if not conf.get('SUPPRESS_CONTEXT_WARNING', False) is True:
# warnings.warn('Context does not have access to request. '
# 'See README for more information.')
return fields
# NOTE: drf test framework builds a request object where the query
@ -47,8 +47,8 @@ class DynamicFieldsMixin(object):
params = getattr(
request, 'query_params', getattr(request, 'GET', None)
)
if params is None:
warnings.warn('Request object does not contain query paramters')
# if params is None:
# warnings.warn('Request object does not contain query paramters')
try:
filter_fields = params.get('fields', None).split(',')