1. 程式人生 > 實用技巧 >python後端繼承序列化,不同訪問形式返回不同結果

python後端繼承序列化,不同訪問形式返回不同結果

http://192.168.56.100:8888/workorder/flowconf/

http://192.168.56.100:8888/workorder/flowconf/1/

1. 表設計

from django.db import models

# Create your models here.


class FlowConf(models.Model):
    name = models.CharField('工作流名稱', max_length=50)
    customfield = models.TextField(verbose_name='自定義欄位')
    description 
= models.TextField(verbose_name='描述') def __str__(self): return self.name class Meta: db_table='tb_flowconf' class ApproveConf(models.Model): approve_type_chice= ( ('1', "指定人員審批"), ('2', "角色組審批"), ) flowconf=models.ForeignKey(FlowConf,on_delete=models.CASCADE) sequence
= models.CharField(max_length=64,verbose_name='自批序號') approve_type_id= models.CharField(choices=approve_type_chice, default='1',max_length=16) approve_id = models.CharField(max_length=32,verbose_name='審批ID') def __str__(self): return self.sequence class Meta: db_table
='tb_approveactionconf'
models.py

2.檢視

from django.shortcuts import render

# Create your views here.

from rest_framework import viewsets
from workflow.serializers import *
from workflow.models import *


from rest_framework.pagination import PageNumberPagination
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter

# 分頁(區域性):自定義分頁器 區域性
class PageNum(PageNumberPagination):
    # 查詢字串中代表每頁返回資料數量的引數名, 預設值: None
    page_size_query_param = 'page_size'



class FlowConfViewSet(viewsets.ModelViewSet):
    queryset =FlowConf.objects.all()
    serializer_class =FlowConfSerializers
    filter_backends = (DjangoFilterBackend, OrderingFilter)
    filter_fields = ('name',)
    # 3.分頁:自定義分頁器 覆蓋全域性配置
    pagination_class = PageNum

    #不同形式發訪問返回不同的序列化
    def get_serializer_class(self):
        if self.action=='list':
            return FlowConfSerializers
        else:
            return FlowConfDeepSerializer


class ApproveConfViewSet(viewsets.ModelViewSet):
    queryset = ApproveConf.objects.all()
    serializer_class = ApproveConfSerializers
Views.py

3序列化

from rest_framework import serializers
from workflow.models import *
from user.models import User,Role

#工單模板
class FlowConfSerializers(serializers.ModelSerializer):
    class Meta:
        model=FlowConf
        fields="__all__"



#審批流
class ApproveConfSerializers(serializers.ModelSerializer):
    # 自定義欄位
    approve_user=serializers.SerializerMethodField(required=False)
    class Meta:
        model=ApproveConf
        fields="__all__"

    def get_approve_user(self,row):
        print(row,'444444444444',type(row))
        approve_type_id=row.approve_type_id  #審批型別id
        approve_id=row.approve_id            #審批使用者id或者角色id

        if approve_id=='1':
            '使用者審批'
            approve=User.objects.get(id=approve_id)
            return {
                'approve':approve.username,
                'approve_type':'指定人員'
            }
        elif approve_id=='2':
            '角色審批'
            approve=Role.objects.get(id=approve_id)
            return {
                'approve':approve.name,
                'approve_type':'角色審批'
            }
        else:
            '其它審批型別待補充'







#繼承工單模板序列化
class FlowConfDeepSerializer(FlowConfSerializers):
    approveconf_set=ApproveConfSerializers(many=True)
serializers.py