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): class UserFilter(filters.FilterSet):
name = filters.CharFilter(field_name='name', lookup_expr='contains')
fields = filters.CharFilter(method='filter_fields')
class Meta: class Meta:
model = User model = User
fields = { fields = ['name', 'is_active', 'fields']
'name': ['exact', 'contains'],
'is_active': ['exact'], 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, from .models import (Dict, DictType, File, Organization, Permission, Position,
Role, User) Role, User)
from utils.mixins import DynamicFieldsMixin
class IntervalSerializer(serializers.ModelSerializer): class IntervalSerializer(serializers.ModelSerializer):
class Meta: class Meta:
@ -132,7 +133,7 @@ class UserSimpleSerializer(serializers.ModelSerializer):
# fields = ['id', 'username', 'name', 'is_active', 'dept_name', 'dept'] # 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. 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): class DynamicFieldsMixin(object):
@ -36,10 +36,10 @@ class DynamicFieldsMixin(object):
try: try:
request = self.context['request'] request = self.context['request']
except KeyError: except KeyError:
conf = getattr(settings, 'DRF_DYNAMIC_FIELDS', {}) # conf = getattr(settings, 'DRF_DYNAMIC_FIELDS', {})
if not conf.get('SUPPRESS_CONTEXT_WARNING', False) is True: # if not conf.get('SUPPRESS_CONTEXT_WARNING', False) is True:
warnings.warn('Context does not have access to request. ' # warnings.warn('Context does not have access to request. '
'See README for more information.') # 'See README for more information.')
return fields return fields
# NOTE: drf test framework builds a request object where the query # NOTE: drf test framework builds a request object where the query
@ -47,8 +47,8 @@ class DynamicFieldsMixin(object):
params = getattr( params = getattr(
request, 'query_params', getattr(request, 'GET', None) request, 'query_params', getattr(request, 'GET', None)
) )
if params is None: # if params is None:
warnings.warn('Request object does not contain query paramters') # warnings.warn('Request object does not contain query paramters')
try: try:
filter_fields = params.get('fields', None).split(',') filter_fields = params.get('fields', None).split(',')