drf 动态字段 mixins

This commit is contained in:
caoqianming 2022-01-24 16:21:00 +08:00
parent f6a7ada99f
commit efc101d2a1
6 changed files with 25 additions and 17 deletions

View File

@ -15,7 +15,8 @@ class MbFilterSet(filters.FilterSet):
def filter_tag(self, queryset, name, value):
if value == 'expired':
queryset = queryset.exclude(expiration_date=None).filter(expiration_date__lte=timezone.now())
queryset = queryset.exclude(expiration_date=None).filter(
expiration_date__lte=timezone.now())
return queryset

View File

@ -5,15 +5,6 @@ from utils.mixins import DynamicFieldsFilterMixin
class UserFilter(DynamicFieldsFilterMixin, filters.FilterSet):
name = filters.CharFilter(field_name='name', lookup_expr='contains')
fields = filters.CharFilter(method='filter_fields')
omit = filters.CharFilter(method='filter_omit')
class Meta:
model = User
fields = ['name', 'is_active', 'fields']
def filter_fields(self, queryset, name, value):
return queryset
def filter_omit(self, queryset, name, value):
return queryset
fields = ['name', 'is_active']

View File

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

View File

@ -2,6 +2,7 @@ from django_filters import rest_framework as filters
from apps.mtm.models import Material, Step
from apps.wpm.services import WpmServies
from utils.mixins import DynamicFieldsFilterMixin
from .models import Operation, OperationMaterial, OperationRecord, WMaterial, WProduct
@ -28,11 +29,15 @@ class WMaterialFilterSet(filters.FilterSet):
return queryset
class WProductFilterSet(filters.FilterSet):
class WProductFilterSet(DynamicFieldsFilterMixin, filters.FilterSet):
tag = filters.CharFilter(method='filter_tag')
production_plan = filters.NumberFilter(
field_name='subproduction_plan__production_plan')
def filter_fields(self, queryset, name, value):
return queryset
def filter_omit(self, queryset, name, value):
return queryset
class Meta:
model = WProduct
fields = ['step', 'subproduction_plan', 'material',

View File

@ -20,6 +20,7 @@ from apps.system.serializers import UserSimpleSerializer
from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem, WprouctTicket
from django.db import transaction
from apps.sam.models import Order
from utils.mixins import DynamicFieldsSerializerMixin
class PickHalfSerializer(serializers.Serializer):
id = serializers.PrimaryKeyRelatedField(queryset=SubProductionProgress.objects.all(), label='子计划进度ID')
@ -147,7 +148,7 @@ class WProductBaseSerializer(serializers.ModelSerializer):
model = WProduct
fields = '__all__'
class WProductListSerializer(serializers.ModelSerializer):
class WProductListSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializer):
"""
半成品列表
"""

View File

@ -7,10 +7,20 @@ from django_filters import rest_framework as filters
# from django.conf import settings
class DynamicFieldsFilterMixin(object):
fields = filters.CharFilter(method='filter_fields')
omit = filters.CharFilter(method='filter_omit')
def filter_fields(self, queryset, name, value):
return queryset
class DynamicFieldsMixin(object):
def filter_omit(self, queryset, name, value):
return queryset
@property
def fields(self):
fields = super(DynamicFieldsFilterMixin, self).fields
fields.extend(['fields', 'omit'])
return fields
class DynamicFieldsSerializerMixin(object):
"""
A serializer mixin that takes an additional `fields` argument that controls
which fields should be displayed.
@ -24,7 +34,7 @@ class DynamicFieldsMixin(object):
passing `fields` will pass all fields individual fields are comma
separated (?fields=id,name,url,email).
"""
fields = super(DynamicFieldsMixin, self).fields
fields = super(DynamicFieldsSerializerMixin, self).fields
if not hasattr(self, '_context'):
# We are being called before a request cycle