序列化器
from rest_framework import serializers
class MySerializer(serializers.ModelSerializer):
"""
序列化器
"""
class Meta:
model = None # 可以设置为None,动态生成之后,再通过反射来重新设置。
fields = '__all__'
视图类
from django.db import (
models
)
from rest_framework.viewsets import (
ModelViewSet
)
# 导入序列化器
from .serializers import (
MySerializer
)
class MyView(ModelViewSet):
"""
表信息具体数据
"""
queryset = None
serializer_class = MySerializer
# 过滤类
filter_backends = [SearchFilter, OrderingFilter]
def dispatch(self, request, *args, **kwargs):
# 获取表名,我是放在了路由的后面
table_name = request.GET.get('table_name')
if not table_name:
raise Exception('缺少必要参数')
# 表模型字典
models_dic = {
'__module__': 'myapp.models',
'Meta':type('Meat',(),{
'db_table':'{}'.format(table_name) # 指定数据库的表名
})
}
# 动态获取表都有哪些信息。我把这些表的字段和类型存在了数据库。
# 比如说我在表里面保存了 { field : name , type : CharField }
table_info_queryset = TableInfo.objects.all()
for _queryset in table_info_queryset:
models_dic.update({
_query.field: getattr(models, _query.type)(max_length=255)
})
# 生成模型表
orm_model = type('TempModel', (models.Model,), models_dic)
# 获取模型表数据
orm_queryset = orm_model.objects.all()
# 获取序列化器的Meta
_meta = getattr(self.serializer_class, 'Meta')
# 通过反射,给序列化器的Meta的model重新设置为我们临时生成的model模型表
setattr(_meta, 'model', orm_model)
# 为当前视图重新设置我们临时生成的model模型表
setattr(self, 'queryset', orm_queryset)
# 下面两个是给搜索和排序重新设置
setattr(self, 'search_fields', search_fields)
setattr(self, 'ordering_fields', ordering_fields)
return super().dispatch(request, *args, **kwargs)
标签:name,models,queryset,动态创建,Django,table,model,序列化,drf
From: https://www.cnblogs.com/BaiJiaZhengMing/p/17814407.html