some correct
This commit is contained in:
parent
67df4b297f
commit
66208baf14
|
@ -361,7 +361,7 @@ export function genTree(data) {
|
|||
map[item.id] = item
|
||||
})
|
||||
data.forEach(item => {
|
||||
const parent = map[item.pid]
|
||||
const parent = map[item.parent]
|
||||
if (parent) {
|
||||
(parent.children || (parent.children = [])).push(item)
|
||||
} else {
|
||||
|
|
|
@ -60,8 +60,7 @@ service.interceptors.response.use(
|
|||
type: 'error',
|
||||
duration: 5 * 1000
|
||||
})
|
||||
|
||||
// return Promise.reject(new Error(res.error || '请求出错'))
|
||||
return Promise.reject(new Error(res.msg || '请求出错'))
|
||||
} else {
|
||||
return res
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
<template slot-scope="scope">{{ scope.row.name }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="header-center" label="描述">
|
||||
<template slot-scope="scope">{{ scope.row.desc }}</template>
|
||||
<template slot-scope="scope">{{ scope.row.description }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="header-center" label="排序">
|
||||
<template
|
||||
|
@ -111,8 +111,8 @@
|
|||
<el-form-item label="代号" prop="code">
|
||||
<el-input v-model="dicttype.code" placeholder="代号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="父级" prop="pid">
|
||||
<treeselect v-model="dicttype.pid" :multiple="false" :options="dictTypeData" placeholder="父级"/>
|
||||
<el-form-item label="父级" prop="parent">
|
||||
<treeselect v-model="dicttype.parent" :multiple="false" :options="dictTypeData" placeholder="父级"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div style="text-align:right;">
|
||||
|
@ -125,8 +125,8 @@
|
|||
<el-form-item label="名称" prop="name">
|
||||
<el-input v-model="dict.name" placeholder="名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="描述" prop="desc">
|
||||
<el-input v-model="dict.desc" placeholder="描述" />
|
||||
<el-form-item label="描述" prop="description">
|
||||
<el-input v-model="dict.description" placeholder="描述" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div style="text-align:right;">
|
||||
|
@ -158,12 +158,12 @@ const defaultDictType = {
|
|||
id: '',
|
||||
name: '',
|
||||
code: '',
|
||||
pid: null
|
||||
parent: null
|
||||
}
|
||||
const defaultDict = {
|
||||
id: '',
|
||||
name: '',
|
||||
desc: '',
|
||||
description: '',
|
||||
sort: 1,
|
||||
type: null
|
||||
}
|
||||
|
|
|
@ -59,8 +59,8 @@
|
|||
<el-form-item label="名称" prop="name">
|
||||
<el-input v-model="org.name" placeholder="名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="上级部门" prop="pid">
|
||||
<treeselect v-model="org.pid" :multiple="false" :options="tableData" placeholder="父级"/>
|
||||
<el-form-item label="上级部门" prop="parent">
|
||||
<treeselect v-model="org.parent" :multiple="false" :options="tableData" placeholder="父级"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div style="text-align:right;">
|
||||
|
@ -81,7 +81,7 @@ import '@riophae/vue-treeselect/dist/vue-treeselect.css'
|
|||
const defaultOrg = {
|
||||
id: null,
|
||||
name: '',
|
||||
pid: null
|
||||
parent: null
|
||||
}
|
||||
export default {
|
||||
components: { Treeselect },
|
||||
|
@ -90,7 +90,7 @@ export default {
|
|||
org: {
|
||||
id: '',
|
||||
name: '',
|
||||
pid: ''
|
||||
parent: ''
|
||||
},
|
||||
search: '',
|
||||
tableData: [],
|
||||
|
@ -100,7 +100,7 @@ export default {
|
|||
dialogType: 'new',
|
||||
rule1: {
|
||||
name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
|
||||
pid: [{ required: true, message: '请选择上级', trigger: 'change' }]
|
||||
parent: [{ required: true, message: '请选择上级', trigger: 'change' }]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -69,8 +69,8 @@
|
|||
<el-form-item label="代号" prop="method">
|
||||
<el-input v-model="perm.method" placeholder="代号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="父级" prop="pid">
|
||||
<treeselect v-model="perm.pid" :multiple="false" :options="tableData" placeholder="父级"/>
|
||||
<el-form-item label="父级" prop="parent">
|
||||
<treeselect v-model="perm.parent" :multiple="false" :options="tableData" placeholder="父级"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<el-input-number v-model="perm.sort" :min="1" label="排序"></el-input-number>
|
||||
|
@ -97,7 +97,7 @@ const defaultPerm = {
|
|||
type: '目录',
|
||||
method: '',
|
||||
sort:1,
|
||||
pid: null
|
||||
parent: null
|
||||
}
|
||||
export default {
|
||||
components: { Treeselect },
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
<template slot-scope="scope">{{ scope.row.name }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="header-center" label="角色描述">
|
||||
<template slot-scope="scope">{{ scope.row.desc }}</template>
|
||||
<template slot-scope="scope">{{ scope.row.description }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="操作">
|
||||
<template slot-scope="scope">
|
||||
|
@ -43,7 +43,7 @@
|
|||
</el-form-item>
|
||||
<el-form-item label="描述">
|
||||
<el-input
|
||||
v-model="role.desc"
|
||||
v-model="role.description"
|
||||
:autosize="{ minRows: 2, maxRows: 4}"
|
||||
type="textarea"
|
||||
placeholder="角色描述"
|
||||
|
@ -112,7 +112,7 @@ import { getOrgAll } from '@/api/org'
|
|||
const defaultRole = {
|
||||
id: '',
|
||||
name: '',
|
||||
desc: '',
|
||||
description: '',
|
||||
perms: [],
|
||||
datas: '本级及以下',
|
||||
depts: []
|
||||
|
@ -252,14 +252,14 @@ export default {
|
|||
this.getRoleAll()
|
||||
}
|
||||
|
||||
const { desc, name } = this.role
|
||||
const { description, name } = this.role
|
||||
this.dialogVisible = false
|
||||
this.$notify({
|
||||
title: '成功',
|
||||
dangerouslyUseHTMLString: true,
|
||||
message: `
|
||||
<div>角色名: ${name}</div>
|
||||
<div>角色描述: ${desc}</div>
|
||||
<div>角色描述: ${description}</div>
|
||||
`,
|
||||
type: 'success'
|
||||
})
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
# Generated by Django 3.0.7 on 2020-06-09 07:49
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('system', '0010_file_path'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='file',
|
||||
options={'verbose_name': '文件库', 'verbose_name_plural': '文件库'},
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='dict',
|
||||
old_name='desc',
|
||||
new_name='description',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='dict',
|
||||
old_name='pid',
|
||||
new_name='parent',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='dicttype',
|
||||
old_name='pid',
|
||||
new_name='parent',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='historicaldict',
|
||||
old_name='desc',
|
||||
new_name='description',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='historicaldict',
|
||||
old_name='pid',
|
||||
new_name='parent',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='organization',
|
||||
old_name='pid',
|
||||
new_name='parent',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='permission',
|
||||
old_name='pid',
|
||||
new_name='parent',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='position',
|
||||
old_name='desc',
|
||||
new_name='description',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='role',
|
||||
old_name='desc',
|
||||
new_name='description',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dict',
|
||||
name='code',
|
||||
field=models.CharField(blank=True, max_length=30, null=True, verbose_name='编号'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='historicaldict',
|
||||
name='code',
|
||||
field=models.CharField(blank=True, max_length=30, null=True, verbose_name='编号'),
|
||||
),
|
||||
]
|
|
@ -21,7 +21,7 @@ class CreateModelBMixin:
|
|||
业务用基本表B用
|
||||
"""
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(create_by = self.request.user, belong_to=self.request.user.dept)
|
||||
serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
|
||||
|
||||
class UpdateModelBMixin:
|
||||
"""
|
||||
|
|
|
@ -14,7 +14,7 @@ class Position(BaseModel):
|
|||
职位/岗位
|
||||
"""
|
||||
name = models.CharField('名称', max_length=32, unique=True)
|
||||
desc = models.CharField('描述', max_length=50, blank=True, null=True)
|
||||
description = models.CharField('描述', max_length=50, blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = '职位/岗位'
|
||||
|
@ -38,7 +38,7 @@ class Permission(SoftModel):
|
|||
choices=menu_type_choices, default='接口')
|
||||
is_frame = models.BooleanField('外部链接', default=False)
|
||||
sort = models.IntegerField('排序标记', default=1)
|
||||
pid = models.ForeignKey('self', null=True, blank=True,
|
||||
parent = models.ForeignKey('self', null=True, blank=True,
|
||||
on_delete=models.SET_NULL, verbose_name='父')
|
||||
method = models.CharField('方法/代号', max_length=50,
|
||||
unique=True, null=True, blank=True)
|
||||
|
@ -63,7 +63,7 @@ class Organization(SoftModel):
|
|||
name = models.CharField('名称', max_length=60)
|
||||
type = models.CharField('类型', max_length=20,
|
||||
choices=organization_type_choices, default='部门')
|
||||
pid = models.ForeignKey('self', null=True, blank=True,
|
||||
parent = models.ForeignKey('self', null=True, blank=True,
|
||||
on_delete=models.SET_NULL, verbose_name='父')
|
||||
|
||||
class Meta:
|
||||
|
@ -92,7 +92,7 @@ class Role(SoftModel):
|
|||
choices=data_type_choices, default='本级及以下')
|
||||
depts = models.ManyToManyField(
|
||||
Organization, blank=True, verbose_name='权限范围')
|
||||
desc = models.CharField('描述', max_length=50, blank=True, null=True)
|
||||
description = models.CharField('描述', max_length=50, blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = '角色'
|
||||
|
@ -132,7 +132,7 @@ class DictType(SoftModel):
|
|||
"""
|
||||
name = models.CharField('名称', max_length=30)
|
||||
code = models.CharField('代号', unique=True, max_length=30)
|
||||
pid = models.ForeignKey('self', null=True, blank=True,
|
||||
parent = models.ForeignKey('self', null=True, blank=True,
|
||||
on_delete=models.SET_NULL, verbose_name='父')
|
||||
|
||||
class Meta:
|
||||
|
@ -148,13 +148,13 @@ class Dict(SoftModel):
|
|||
数据字典
|
||||
"""
|
||||
name = models.CharField('名称', max_length=30, unique=True)
|
||||
code = models.CharField('代码', max_length=30, null=True, blank=True)
|
||||
desc = models.TextField('描述', blank=True, null=True)
|
||||
code = models.CharField('编号', max_length=30, null=True, blank=True)
|
||||
description = models.TextField('描述', blank=True, null=True)
|
||||
enabled = models.BooleanField('是否有效', default=True)
|
||||
type = models.ForeignKey(
|
||||
DictType, on_delete=models.CASCADE, verbose_name='类型')
|
||||
sort = models.IntegerField('排序', default=1)
|
||||
pid = models.ForeignKey('self', null=True, blank=True,
|
||||
parent = models.ForeignKey('self', null=True, blank=True,
|
||||
on_delete=models.SET_NULL, verbose_name='父')
|
||||
history = HistoricalRecords()
|
||||
|
||||
|
@ -180,14 +180,14 @@ class CommonAModel(SoftModel):
|
|||
|
||||
class CommonBModel(SoftModel):
|
||||
"""
|
||||
业务用基本表B,包含create_by, update_by, belong_to字段
|
||||
业务用基本表B,包含create_by, update_by, belong_dept字段
|
||||
"""
|
||||
create_by = models.ForeignKey(
|
||||
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name='create_by')
|
||||
update_by = models.ForeignKey(
|
||||
User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name='update_by')
|
||||
belong_to = models.ForeignKey(
|
||||
Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='所属部门', related_name='belong_to')
|
||||
belong_dept = models.ForeignKey(
|
||||
Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='所属部门', related_name='belong_dept')
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
|
|
@ -66,7 +66,7 @@ def has_obj_perm(user, obj):
|
|||
"""
|
||||
数据权限控权
|
||||
返回对象的是否可以操作
|
||||
需要控数据权限的表需有belong_to, create_by, update_by字段(部门, 创建人, 编辑人)
|
||||
需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人)
|
||||
传入user, obj实例
|
||||
"""
|
||||
roles = user.roles
|
||||
|
@ -75,18 +75,18 @@ def has_obj_perm(user, obj):
|
|||
return True
|
||||
elif '自定义' in data_range:
|
||||
if roles.depts.exists():
|
||||
if obj.belong_to not in roles.depts:
|
||||
if obj.belong_dept not in roles.depts:
|
||||
return False
|
||||
elif '同级及以下' in data_range:
|
||||
if user.dept.pid:
|
||||
belong_tos = get_child_queryset2(user.dept.pid)
|
||||
if obj.belong_to not in belong_tos:
|
||||
if user.dept.parent:
|
||||
belong_depts = get_child_queryset2(user.dept.parent)
|
||||
if obj.belong_dept not in belong_depts:
|
||||
return False
|
||||
elif '本级及以下' in data_range:
|
||||
belong_tos = get_child_queryset2(user.dept)
|
||||
if obj.belong_to not in belong_tos:
|
||||
belong_depts = get_child_queryset2(user.dept)
|
||||
if obj.belong_dept not in belong_depts:
|
||||
return False
|
||||
elif '本级' in data_range:
|
||||
if obj.belong_to is not user.dept:
|
||||
if obj.belong_dept is not user.dept:
|
||||
return False
|
||||
return True
|
|
@ -9,7 +9,7 @@ class RbacFilterSet(GenericAPIView):
|
|||
"""
|
||||
数据权限控权返回的queryset
|
||||
在必须的View下继承
|
||||
需要控数据权限的表需有belong_to, create_by, update_by字段(部门, 创建人, 编辑人)
|
||||
需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人)
|
||||
"""
|
||||
def get_queryset(self):
|
||||
assert self.queryset is not None, (
|
||||
|
@ -22,7 +22,7 @@ class RbacFilterSet(GenericAPIView):
|
|||
if isinstance(queryset, QuerySet):
|
||||
# Ensure queryset is re-evaluated on each request.
|
||||
queryset = queryset.all()
|
||||
if hasattr(queryset.model, 'belong_to'):
|
||||
if hasattr(queryset.model, 'belong_dept'):
|
||||
user = self.request.user
|
||||
roles = user.roles
|
||||
data_range = roles.values_list('datas', flat=True)
|
||||
|
@ -30,19 +30,19 @@ class RbacFilterSet(GenericAPIView):
|
|||
return queryset
|
||||
elif '自定义' in data_range:
|
||||
if roles.depts.exists():
|
||||
queryset = queryset.filter(belong_to__in = roles.depts)
|
||||
queryset = queryset.filter(belong_dept__in = roles.depts)
|
||||
return queryset
|
||||
elif '同级及以下' in data_range:
|
||||
if user.dept.pid:
|
||||
belong_tos = get_child_queryset2(user.dept.pid)
|
||||
queryset = queryset.filter(belong_to__in = belong_tos)
|
||||
if user.dept.parent:
|
||||
belong_depts = get_child_queryset2(user.dept.parent)
|
||||
queryset = queryset.filter(belong_dept__in = belong_depts)
|
||||
return queryset
|
||||
elif '本级及以下' in data_range:
|
||||
belong_tos = get_child_queryset2(user.dept)
|
||||
queryset = queryset.filter(belong_to__in = belong_tos)
|
||||
belong_depts = get_child_queryset2(user.dept)
|
||||
queryset = queryset.filter(belong_dept__in = belong_depts)
|
||||
return queryset
|
||||
elif '本级' in data_range:
|
||||
queryset = queryset.filter(belong_to = user.dept)
|
||||
queryset = queryset.filter(belong_dept = user.dept)
|
||||
return queryset
|
||||
elif '仅本人' in data_range:
|
||||
queryset = queryset.filter(Q(create_by=user)|Q(update_by=user))
|
||||
|
@ -54,29 +54,29 @@ class RbacFilterSet(GenericAPIView):
|
|||
def rbac_filter_queryset(user, queryset):
|
||||
"""
|
||||
数据权限控权返回的queryset方法
|
||||
需要控数据权限的表需有belong_to, create_by, update_by字段(部门, 创建人, 编辑人)
|
||||
需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人)
|
||||
传入user实例,queryset
|
||||
"""
|
||||
roles = user.roles
|
||||
data_range = roles.values_list('datas', flat=True)
|
||||
if hasattr(queryset.model, 'belong_to'):
|
||||
if hasattr(queryset.model, 'belong_dept'):
|
||||
if '全部' in data_range:
|
||||
return queryset
|
||||
elif '自定义' in data_range:
|
||||
if roles.depts.exists():
|
||||
queryset = queryset.filter(belong_to__in = roles.depts)
|
||||
queryset = queryset.filter(belong_dept__in = roles.depts)
|
||||
return queryset
|
||||
elif '同级及以下' in data_range:
|
||||
if user.dept.pid:
|
||||
belong_tos = get_child_queryset2(user.dept.pid)
|
||||
queryset = queryset.filter(belong_to__in = belong_tos)
|
||||
if user.dept.parent:
|
||||
belong_depts = get_child_queryset2(user.dept.parent)
|
||||
queryset = queryset.filter(belong_dept__in = belong_depts)
|
||||
return queryset
|
||||
elif '本级及以下' in data_range:
|
||||
belong_tos = get_child_queryset2(user.dept)
|
||||
queryset = queryset.filter(belong_to__in = belong_tos)
|
||||
belong_depts = get_child_queryset2(user.dept)
|
||||
queryset = queryset.filter(belong_dept__in = belong_depts)
|
||||
return queryset
|
||||
elif '本级' in data_range:
|
||||
queryset = queryset.filter(belong_to = user.dept)
|
||||
queryset = queryset.filter(belong_dept = user.dept)
|
||||
return queryset
|
||||
elif '仅本人' in data_range:
|
||||
queryset = queryset.filter(Q(create_by=user)|Q(update_by=user))
|
||||
|
|
|
@ -76,7 +76,7 @@ class DictViewSet(ModelViewSet):
|
|||
'put': 'dict_update', 'delete': 'dict_delete'}
|
||||
queryset = Dict.objects.all()
|
||||
serializer_class = DictSerializer
|
||||
search_fields = ['^name']
|
||||
search_fields = ['name']
|
||||
ordering_fields = ['id']
|
||||
ordering = 'id'
|
||||
|
||||
|
@ -90,7 +90,7 @@ class PositionViewSet(ModelViewSet):
|
|||
queryset = Position.objects.all()
|
||||
serializer_class = PositionSerializer
|
||||
pagination_class = None
|
||||
search_fields = ['name','desc']
|
||||
search_fields = ['name','description']
|
||||
ordering_fields = ['id']
|
||||
ordering = 'id'
|
||||
|
||||
|
@ -124,7 +124,7 @@ class OrganizationViewSet(ModelViewSet):
|
|||
queryset = Organization.objects.all()
|
||||
serializer_class = OrganizationSerializer
|
||||
pagination_class = None
|
||||
search_fields = ['^name', '^method']
|
||||
search_fields = ['name', 'method']
|
||||
ordering_fields = ['id']
|
||||
ordering = 'id'
|
||||
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,6 @@
|
|||
from rest_framework.pagination import PageNumberPagination
|
||||
|
||||
|
||||
class MyPagination(PageNumberPagination):
|
||||
page_size = 10
|
||||
page_size_query_param = 'limit'
|
|
@ -14,10 +14,10 @@ def get_child_queryset_u(checkQueryset, obj, hasParent=True):
|
|||
fatherQueryset = cls.objects.filter(pk=obj.id)
|
||||
if hasParent:
|
||||
queryset = queryset | fatherQueryset
|
||||
child_queryset = checkQueryset.filter(pid=obj)
|
||||
child_queryset = checkQueryset.filter(parent=obj)
|
||||
while child_queryset:
|
||||
queryset = queryset | child_queryset
|
||||
child_queryset = checkQueryset.filter(pid__in=child_queryset)
|
||||
child_queryset = checkQueryset.filter(parent__in=child_queryset)
|
||||
return queryset
|
||||
|
||||
|
||||
|
@ -35,10 +35,10 @@ def get_child_queryset(name, pk, hasParent=True):
|
|||
if fatherQueryset.exists():
|
||||
if hasParent:
|
||||
queryset = queryset | fatherQueryset
|
||||
child_queryset = cls.objects.filter(pid=fatherQueryset.first())
|
||||
child_queryset = cls.objects.filter(parent=fatherQueryset.first())
|
||||
while child_queryset:
|
||||
queryset = queryset | child_queryset
|
||||
child_queryset = cls.objects.filter(pid__in=child_queryset)
|
||||
child_queryset = cls.objects.filter(parent__in=child_queryset)
|
||||
return queryset
|
||||
|
||||
def get_child_queryset2(obj, hasParent=True):
|
||||
|
@ -53,8 +53,8 @@ def get_child_queryset2(obj, hasParent=True):
|
|||
fatherQueryset = cls.objects.filter(pk=obj.id)
|
||||
if hasParent:
|
||||
queryset = queryset | fatherQueryset
|
||||
child_queryset = cls.objects.filter(pid=obj)
|
||||
child_queryset = cls.objects.filter(parent=obj)
|
||||
while child_queryset:
|
||||
queryset = queryset | child_queryset
|
||||
child_queryset = cls.objects.filter(pid__in=child_queryset)
|
||||
child_queryset = cls.objects.filter(parent__in=child_queryset)
|
||||
return queryset
|
|
@ -3,37 +3,37 @@ from rest_framework import serializers
|
|||
|
||||
|
||||
|
||||
class TreeSerializer(serializers.Serializer):
|
||||
id = serializers.IntegerField()
|
||||
label = serializers.CharField(max_length=20, source='name')
|
||||
pid = serializers.PrimaryKeyRelatedField(read_only=True)
|
||||
# class TreeSerializer(serializers.Serializer):
|
||||
# id = serializers.IntegerField()
|
||||
# label = serializers.CharField(max_length=20, source='name')
|
||||
# pid = serializers.PrimaryKeyRelatedField(read_only=True)
|
||||
|
||||
|
||||
class TreeAPIView(ListAPIView):
|
||||
"""
|
||||
自定义树结构View
|
||||
"""
|
||||
serializer_class = TreeSerializer
|
||||
# class TreeAPIView(ListAPIView):
|
||||
# """
|
||||
# 自定义树结构View
|
||||
# """
|
||||
# serializer_class = TreeSerializer
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
queryset = self.filter_queryset(self.get_queryset())
|
||||
page = self.paginate_queryset(queryset)
|
||||
serializer = self.get_serializer(queryset, many=True)
|
||||
tree_dict = {}
|
||||
tree_data = []
|
||||
try:
|
||||
for item in serializer.data:
|
||||
tree_dict[item['id']] = item
|
||||
for i in tree_dict:
|
||||
if tree_dict[i]['pid']:
|
||||
pid = tree_dict[i]['pid']
|
||||
parent = tree_dict[pid]
|
||||
parent.setdefault('children', []).append(tree_dict[i])
|
||||
else:
|
||||
tree_data.append(tree_dict[i])
|
||||
results = tree_data
|
||||
except KeyError:
|
||||
results = serializer.data
|
||||
if page is not None:
|
||||
return self.get_paginated_response(results)
|
||||
return Response(results)
|
||||
# def list(self, request, *args, **kwargs):
|
||||
# queryset = self.filter_queryset(self.get_queryset())
|
||||
# page = self.paginate_queryset(queryset)
|
||||
# serializer = self.get_serializer(queryset, many=True)
|
||||
# tree_dict = {}
|
||||
# tree_data = []
|
||||
# try:
|
||||
# for item in serializer.data:
|
||||
# tree_dict[item['id']] = item
|
||||
# for i in tree_dict:
|
||||
# if tree_dict[i]['pid']:
|
||||
# pid = tree_dict[i]['pid']
|
||||
# parent = tree_dict[pid]
|
||||
# parent.setdefault('children', []).append(tree_dict[i])
|
||||
# else:
|
||||
# tree_data.append(tree_dict[i])
|
||||
# results = tree_data
|
||||
# except KeyError:
|
||||
# results = serializer.data
|
||||
# if page is not None:
|
||||
# return self.get_paginated_response(results)
|
||||
# return Response(results)
|
||||
|
|
Loading…
Reference in New Issue