添加用户及角色过滤
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Generated by Django 5.2.1 on 2025-07-03 02:43
|
||||
# Generated by Django 5.2.1 on 2025-07-03 03:44
|
||||
|
||||
import django.contrib.auth.models
|
||||
import django.contrib.auth.validators
|
||||
@@ -447,6 +447,12 @@ class Migration(migrations.Migration):
|
||||
models.BooleanField(db_comment="是否软删除", default=False),
|
||||
),
|
||||
("name", models.CharField(max_length=100, verbose_name="角色名称")),
|
||||
(
|
||||
"code",
|
||||
models.CharField(
|
||||
blank=True, max_length=100, verbose_name="角色标识"
|
||||
),
|
||||
),
|
||||
(
|
||||
"status",
|
||||
models.IntegerField(
|
||||
|
||||
@@ -124,6 +124,7 @@ class Role(CoreModel):
|
||||
max_length=100,
|
||||
verbose_name='角色名称'
|
||||
)
|
||||
code = models.CharField(max_length=100, blank=True, verbose_name='角色标识')
|
||||
status = models.IntegerField(
|
||||
choices=CommonStatus.choices,
|
||||
default=CommonStatus.ENABLED,
|
||||
|
||||
@@ -4,6 +4,7 @@ from rest_framework.decorators import action
|
||||
from rest_framework.filters import SearchFilter, OrderingFilter
|
||||
from rest_framework.generics import get_object_or_404
|
||||
from rest_framework.response import Response
|
||||
from django_filters import rest_framework as filters
|
||||
|
||||
from system.models import RolePermission, Menu, Role
|
||||
from utils.custom_model_viewSet import CustomModelViewSet
|
||||
@@ -29,13 +30,22 @@ class RoleSerializer(CustomModelSerializer):
|
||||
return obj.get_status_display()
|
||||
|
||||
|
||||
class RoleFilter(filters.FilterSet):
|
||||
name = filters.CharFilter(field_name='name', lookup_expr='icontains')
|
||||
code = filters.CharFilter(field_name='code', lookup_expr='icontains')
|
||||
status = filters.CharFilter(field_name='status') # 保持精确,如需模糊可改为 icontains
|
||||
|
||||
class Meta:
|
||||
model = Role
|
||||
fields = ['status', 'name', 'code']
|
||||
|
||||
|
||||
class RoleViewSet(CustomModelViewSet):
|
||||
"""角色管理视图集"""
|
||||
queryset = Role.objects.all()
|
||||
serializer_class = RoleSerializer
|
||||
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
|
||||
filterset_fields = ['status', 'name']
|
||||
filterset_class = RoleFilter
|
||||
search_fields = ['name']
|
||||
ordering_fields = ['create_time']
|
||||
|
||||
|
||||
@@ -6,8 +6,9 @@ from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
from django.contrib.auth.hashers import make_password
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from django_filters import rest_framework as filters
|
||||
|
||||
from system.models import User, Menu, LoginLog
|
||||
from system.models import User, Menu, LoginLog, Dept
|
||||
|
||||
from utils.serializers import CustomModelSerializer
|
||||
from utils.custom_model_viewSet import CustomModelViewSet
|
||||
@@ -15,6 +16,7 @@ from utils.custom_model_viewSet import CustomModelViewSet
|
||||
|
||||
class UserSerializer(CustomModelSerializer):
|
||||
roles = serializers.SerializerMethodField() # 新增字段
|
||||
depts = serializers.SerializerMethodField() # 新增字段
|
||||
"""
|
||||
用户数据 序列化器
|
||||
"""
|
||||
@@ -29,6 +31,10 @@ class UserSerializer(CustomModelSerializer):
|
||||
"""
|
||||
return list(obj.role.values_list('name', flat=True))
|
||||
|
||||
def get_depts(self, obj):
|
||||
# 返回所有部门名称列表
|
||||
return list(obj.dept.values_list('name', flat=True))
|
||||
|
||||
def create(self, validated_data):
|
||||
if 'password' in validated_data:
|
||||
validated_data['password'] = make_password(validated_data['password'])
|
||||
@@ -110,6 +116,33 @@ class Codes(APIView):
|
||||
})
|
||||
|
||||
|
||||
class UserFilter(filters.FilterSet):
|
||||
# 多部门过滤,假设字段为 dept,支持 ?dept=1,2,3
|
||||
dept = filters.CharFilter(method='filter_dept')
|
||||
# 名称和手机号模糊查询
|
||||
username = filters.CharFilter(field_name='username', lookup_expr='icontains')
|
||||
mobile = filters.CharFilter(field_name='mobile', lookup_expr='icontains')
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ['dept', 'username', 'nickname', 'mobile', 'status']
|
||||
|
||||
def filter_dept(self, queryset, name, value):
|
||||
# value 可能是单个id或逗号分隔的多个id
|
||||
dept_ids = [int(i) for i in value.split(',') if i]
|
||||
all_ids = set()
|
||||
for dept_id in dept_ids:
|
||||
all_ids.update(get_dept_and_children_ids(dept_id))
|
||||
return queryset.filter(dept__in=all_ids)
|
||||
|
||||
def get_dept_and_children_ids(dept_id):
|
||||
# 递归查找所有子部门id
|
||||
ids = [dept_id]
|
||||
children = Dept.objects.filter(pid_id=dept_id)
|
||||
for child in children:
|
||||
ids.extend(get_dept_and_children_ids(child.id))
|
||||
return ids
|
||||
|
||||
class UserViewSet(CustomModelViewSet):
|
||||
"""
|
||||
用户数据 视图集
|
||||
@@ -117,10 +150,8 @@ class UserViewSet(CustomModelViewSet):
|
||||
queryset = User.objects.filter(is_deleted=False).order_by('-id')
|
||||
serializer_class = UserSerializer
|
||||
read_only_fields = ['id', 'create_time', 'update_time', 'login_ip']
|
||||
filterset_fields = ['username', 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'remark', 'creator',
|
||||
'modifier', 'is_deleted', 'mobile', 'nickname', 'gender', 'language', 'city', 'province',
|
||||
'country', 'avatar_url', 'status']
|
||||
search_fields = ['name'] # 根据实际字段调整
|
||||
filterset_class = UserFilter
|
||||
search_fields = ['username', 'nickname', 'mobile'] # 支持模糊搜索
|
||||
ordering_fields = ['create_time', 'id']
|
||||
ordering = ['-create_time']
|
||||
|
||||
|
||||
Reference in New Issue
Block a user