Django动态创建表模型,并使用drf

发布时间 2023-11-07 10:06:15作者: 此用户名不可用

序列化器

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)