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): def filter_tag(self, queryset, name, value):
if value == 'expired': 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 return queryset

View File

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

View File

@ -5,7 +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 from utils.mixins import DynamicFieldsSerializerMixin
class IntervalSerializer(serializers.ModelSerializer): class IntervalSerializer(serializers.ModelSerializer):
class Meta: class Meta:
@ -133,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(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.mtm.models import Material, Step
from apps.wpm.services import WpmServies from apps.wpm.services import WpmServies
from utils.mixins import DynamicFieldsFilterMixin
from .models import Operation, OperationMaterial, OperationRecord, WMaterial, WProduct from .models import Operation, OperationMaterial, OperationRecord, WMaterial, WProduct
@ -28,11 +29,15 @@ class WMaterialFilterSet(filters.FilterSet):
return queryset return queryset
class WProductFilterSet(filters.FilterSet): class WProductFilterSet(DynamicFieldsFilterMixin, filters.FilterSet):
tag = filters.CharFilter(method='filter_tag') tag = filters.CharFilter(method='filter_tag')
production_plan = filters.NumberFilter( production_plan = filters.NumberFilter(
field_name='subproduction_plan__production_plan') 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: class Meta:
model = WProduct model = WProduct
fields = ['step', 'subproduction_plan', 'material', 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 apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem, WprouctTicket
from django.db import transaction from django.db import transaction
from apps.sam.models import Order from apps.sam.models import Order
from utils.mixins import DynamicFieldsSerializerMixin
class PickHalfSerializer(serializers.Serializer): class PickHalfSerializer(serializers.Serializer):
id = serializers.PrimaryKeyRelatedField(queryset=SubProductionProgress.objects.all(), label='子计划进度ID') id = serializers.PrimaryKeyRelatedField(queryset=SubProductionProgress.objects.all(), label='子计划进度ID')
@ -147,7 +148,7 @@ class WProductBaseSerializer(serializers.ModelSerializer):
model = WProduct model = WProduct
fields = '__all__' 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 # from django.conf import settings
class DynamicFieldsFilterMixin(object): class DynamicFieldsFilterMixin(object):
fields = filters.CharFilter(method='filter_fields') fields = filters.CharFilter(method='filter_fields')
omit = filters.CharFilter(method='filter_omit')
def filter_fields(self, queryset, name, value): def filter_fields(self, queryset, name, value):
return queryset 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 A serializer mixin that takes an additional `fields` argument that controls
which fields should be displayed. which fields should be displayed.
@ -24,7 +34,7 @@ class DynamicFieldsMixin(object):
passing `fields` will pass all fields individual fields are comma passing `fields` will pass all fields individual fields are comma
separated (?fields=id,name,url,email). separated (?fields=id,name,url,email).
""" """
fields = super(DynamicFieldsMixin, self).fields fields = super(DynamicFieldsSerializerMixin, self).fields
if not hasattr(self, '_context'): if not hasattr(self, '_context'):
# We are being called before a request cycle # We are being called before a request cycle