模型字典主要是指在模型设计过程中对于每个字段的verbose_name和help_text
verbose_name:标示字段显示的中文名
help_text:标示字段帮助信息
我们需要把这两个字段传到前端,让前端据此显示字段的中文名和帮助信息。让前端不必自己为字段命名,从而减少前端对业务的理解。也就是说:前端根据后端提供的数据显示就行了,不需要理解业务。
1 增加模型字典
考虑到多表关联,对已存在模型字典的,则在原有字典上增加,否则新建一个字典来增加。
from django.apps import apps # 重新定义返回值,增加了每个字段的verbose_name和help_text def build_model_dict(app_name, model_name, redefined_data): field_objs = apps.get_model(app_name, model_name)._meta.fields # 考虑多表关联时需要取多个表的数据字典 if not redefined_data.data.get('table_info', None): redefined_data.data['table_info'] = {} for i in range(len(field_objs)): redefined_data.data['table_info'][field_objs[i].name] = { 'verbose_name': field_objs[i].verbose_name, 'help_text': field_objs[i].help_text, } redefined_data.data.move_to_end('table_info', last=False) redefined_data.data.move_to_end('count', last=False) return redefined_data
2 增加序列化器
from rest_framework import serializers from nucleus.models import BookInfo class BookInfoSerializer(serializers.ModelSerializer): """ 图书序列化器 """ class Meta: model = BookInfo # 此处的顺序,控制前端的显示顺序 fields = '__all__'
3 增加视图
特别要注意的是,DRF返回值是一个有序字典OrderedDict类型。
from rest_framework.generics import GenericAPIView, mixins class BookInfoViewSet(GenericAPIView, mixins.ListModelMixin): """ 图书视图 """ queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer def get(self, request): ret_data = build_model_dict('nucleus', 'PublisherInfo', self.list(request)) ret_data = build_model_dict('nucleus', 'BookInfo', ret_data) return ret_data