序列化器
from rest_framework import serializers
class MySerializer(serializers.ModelSerializer):
"""
序列化器
"""
class Meta:
model = None # 可以設(shè)置為None,動態(tài)生成之后,再通過反射來重新設(shè)置。
fields = '__all__'
視圖類
from django.db import (
models
)
from rest_framework.viewsets import (
ModelViewSet
)
# 導(dǎo)入序列化器
from .serializers import (
MySerializer
)
class MyView(ModelViewSet):
"""
表信息具體數(shù)據(jù)
"""
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('缺少必要參數(shù)')
# 表模型字典
models_dic = {
'__module__': 'myapp.models',
'Meta':type('Meat',(),{
'db_table':'{}'.format(table_name) # 指定數(shù)據(jù)庫的表名
})
}
# 動態(tài)獲取表都有哪些信息。我把這些表的字段和類型存在了數(shù)據(jù)庫。
# 比如說我在表里面保存了 { 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)
# 獲取模型表數(shù)據(jù)
orm_queryset = orm_model.objects.all()
# 獲取序列化器的Meta
_meta = getattr(self.serializer_class, 'Meta')
# 通過反射,給序列化器的Meta的model重新設(shè)置為我們臨時生成的model模型表
setattr(_meta, 'model', orm_model)
# 為當(dāng)前視圖重新設(shè)置我們臨時生成的model模型表
setattr(self, 'queryset', orm_queryset)
# 下面兩個是給搜索和排序重新設(shè)置
setattr(self, 'search_fields', search_fields)
setattr(self, 'ordering_fields', ordering_fields)
return super().dispatch(request, *args, **kwargs)