98 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
import pypinyin
 | 
						|
from django.db.models import Q
 | 
						|
from rest_framework import serializers
 | 
						|
 | 
						|
from dvadmin.system.models import Area
 | 
						|
from dvadmin.utils.field_permission import FieldPermissionMixin
 | 
						|
from dvadmin.utils.json_response import SuccessResponse
 | 
						|
from dvadmin.utils.serializers import CustomModelSerializer
 | 
						|
from dvadmin.utils.viewset import CustomModelViewSet
 | 
						|
 | 
						|
 | 
						|
class AreaSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    地区-序列化器
 | 
						|
    """
 | 
						|
    pcode_count = serializers.SerializerMethodField(read_only=True)
 | 
						|
    hasChild = serializers.SerializerMethodField()
 | 
						|
    pcode_info = serializers.SerializerMethodField()
 | 
						|
 | 
						|
    def get_pcode_info(self, instance):
 | 
						|
        pcode = Area.objects.filter(code=instance.pcode_id).values("name", "code")
 | 
						|
        return pcode
 | 
						|
 | 
						|
    def get_pcode_count(self, instance: Area):
 | 
						|
        return Area.objects.filter(pcode=instance).count()
 | 
						|
 | 
						|
    def get_hasChild(self, instance):
 | 
						|
        hasChild = Area.objects.filter(pcode=instance.code)
 | 
						|
        if hasChild:
 | 
						|
            return True
 | 
						|
        return False
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Area
 | 
						|
        fields = "__all__"
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
 | 
						|
class AreaCreateUpdateSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    地区管理 创建/更新时的列化器
 | 
						|
    """
 | 
						|
 | 
						|
    def to_internal_value(self, data):
 | 
						|
        pinyin = ''.join([''.join(i) for i in pypinyin.pinyin(data["name"], style=pypinyin.NORMAL)])
 | 
						|
        data["level"] = 1
 | 
						|
        data["pinyin"] = pinyin
 | 
						|
        data["initials"] = pinyin[0].upper() if pinyin else "#"
 | 
						|
        pcode = data["pcode"] if 'pcode' in data else None
 | 
						|
        if pcode:
 | 
						|
            pcode = Area.objects.get(pk=pcode)
 | 
						|
            data["pcode"] = pcode.code
 | 
						|
            data["level"] = pcode.level + 1
 | 
						|
        return super().to_internal_value(data)
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Area
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class AreaViewSet(CustomModelViewSet, FieldPermissionMixin):
 | 
						|
    """
 | 
						|
    地区管理接口
 | 
						|
    list:查询
 | 
						|
    create:新增
 | 
						|
    update:修改
 | 
						|
    retrieve:单例
 | 
						|
    destroy:删除
 | 
						|
    """
 | 
						|
    queryset = Area.objects.all()
 | 
						|
    serializer_class = AreaSerializer
 | 
						|
    create_serializer_class = AreaCreateUpdateSerializer
 | 
						|
    update_serializer_class = AreaCreateUpdateSerializer
 | 
						|
    extra_filter_class = []
 | 
						|
 | 
						|
    def list(self, request, *args, **kwargs):
 | 
						|
        self.request.query_params._mutable = True
 | 
						|
        params = self.request.query_params
 | 
						|
        known_params = {'page', 'limit', 'pcode'}
 | 
						|
        # 使用集合操作检查是否有未知参数
 | 
						|
        other_params_exist = any(param not in known_params for param in params)
 | 
						|
        if other_params_exist:
 | 
						|
            queryset = self.queryset.filter(enable=True)
 | 
						|
        else:
 | 
						|
            pcode = params.get('pcode', None)
 | 
						|
            params['limit'] = 999
 | 
						|
            if params and pcode:
 | 
						|
                queryset = self.queryset.filter(enable=True, pcode=pcode)
 | 
						|
            else:
 | 
						|
                queryset = self.queryset.filter(enable=True, level=1)
 | 
						|
        page = self.paginate_queryset(queryset)
 | 
						|
        if page is not None:
 | 
						|
            serializer = self.get_serializer(page, many=True, request=request)
 | 
						|
            return self.get_paginated_response(serializer.data)
 | 
						|
        serializer = self.get_serializer(queryset, many=True, request=request)
 | 
						|
        return SuccessResponse(data=serializer.data, msg="获取成功")
 |