满口金牙 2021-11-05 18:55 采纳率: 91.5%
浏览 29
已结题

djanago rest framework 后端,一百个数据表,写一百个model 我忍了, 不可能写一百个 视图函数吧

djanago rest framework 后端
如果我有一百个数据表,写一百个model 我忍了, 不可能写一百个 视图函数吧, 所以得想法子合并

视图函数

class CategoryView(ModelViewSet):  
   #第一个问题: 这里ModelViewSet类里怎么获取前端过来的特殊参数? 上次朋友讲了一个方法( def initial...),不知道还有没有更简便的方法,
    queryset=models.ItemsCategory.objects.all()  # 这里可以改成变量,已经会用了,网友  辉煌仪奇 帮解决了
    serializer_class=CategorySerializer  # 序列化(疑点见下)
    pagination_class=PageNumberPagination
    PageNumberPagination.page_size=100
    filter_class=CategoryFilter # 过滤器(疑点见下)

重点疑问: 序列化

class CategorySerializer(serializers.ModelSerializer):
    #第二个问题:  这里也要写判断, 怎么拿到视图中获取的参数呢?  要改下面的model,把model改成变量,否则得写100遍
    class Meta:
        model=models.ItemsCategory   
        fields='__all__'

重点疑问: 过滤器 (每个表过滤的字段是一样的,所以可以复用)

class CategoryFilter(filters.FilterSet):
    id = filters.CharFilter(lookup_expr='exact')
    id_orderticket = filters.CharFilter(lookup_expr='exact')
    order_date_gte = filters.DateFilter(field_name='order_date', lookup_expr='gte')
    order_date_lte = filters.DateFilter(field_name='order_date', lookup_expr='lte')
    project_name = filters.CharFilter(lookup_expr='icontains')
     #第三个问题:  这里还要是要写判断, 来改下面的model,把model改成变量,否则也得写100遍
    class Meta:
        model = Rebar
        fields = ['id','id_orderticket','sample_name','order_date_gte','order_date_lte','project_name','is_active']
  • 写回答

2条回答 默认 最新

  • 辉煌仪奇 2021-11-06 10:34
    关注

    我不太清楚你的这个怎么用的,这么久了,我也没见过这么好用的东西,回去研究研究
    目前最笨的方法,还是用全局变量,目前不知道你的视图是写在哪里的,但是还是可以使用函数或者全局变量,下面给出三个例子,能用的话加个好友后面多交流一下,我才发现django还有这么好用的东西

    方案一 你的所有上诉class 在views.py,假设你的django访问函数 viewtst,访问方式 post

    #这里是一个数据库模型字典,你把你的往里面存就好了
    database={}
    #这是定义前端访问的全局数据库模型变量
    selectmodels=None
    #前端访问对应路由函数
    class viewtst(View):
        # 装饰器decompose_parameter作用是将post的所有json参数转换成键值对add到kwargs
        @method_decorator(decompose_parameter)
        def post(self, request, *args, **kwargs):
            # 导入全局数据库模型变量
            global  database
            # 设置全局前端访问的数据库模型变量
            global selectmodels
            # 获取前端访问的数据库模型名称
            dataname=kwargs.get('database')
            # 设置全局变量为前端访问的数据库对象
            selectmodels=database.get(dataname)
            #         后续操作...
            return JsonResponse({})
    
    
    
    class CategorySerializer(serializers.ModelSerializer):
        #第二个问题:  这里也要写判断, 怎么拿到视图中获取的参数呢?  要改下面的model,把model改成变量,否则得写100遍
        class Meta:
            # Meta 调用全局变量 selectmodels
            if  selectmodels:
                model=selectmodels
            else:
                #你可以在这里做一个错误处理        
                pass
            fields='__all__'
    
    class CategoryFilter(filters.FilterSet):
        id = filters.CharFilter(lookup_expr='exact')
        id_orderticket = filters.CharFilter(lookup_expr='exact')
        order_date_gte = filters.DateFilter(field_name='order_date', lookup_expr='gte')
        order_date_lte = filters.DateFilter(field_name='order_date', lookup_expr='lte')
        project_name = filters.CharFilter(lookup_expr='icontains')
         #第三个问题:  这里还要是要写判断, 来改下面的model,把model改成变量,否则也得写100遍
        class Meta:
            # Meta 调用全局变量
            # Meta 调用全局变量 selectmodels
            if selectmodels:
                model = selectmodels
            else:
                # 你可以在这里做一个错误处理        
                pass
            fields = ['id','id_orderticket','sample_name','order_date_gte','order_date_lte','project_name','is_active']
    
    class CategoryView(ModelViewSet):
        queryset=selectmodels.objects.all()
        serializer_class = CategorySerializer  # 序列化(疑点见下)
        filter_class = CategoryFilter  # 过滤器(疑点见下)
    

    方案二 你不是在同一个文件定义的他们

    1. views.py
    
    # 这里是一个数据库模型字典,你把你的往里面存就好了
    database = {}
    # 这是定义前端访问的全局数据库模型变量
    selectmodels = None
    
    
    # 前端访问对应路由函数
    class viewtst(View):
        # 装饰器decompose_parameter作用是将post的所有json参数转换成键值对add到kwargs
        @method_decorator(decompose_parameter)
        def post(self, request, *args, **kwargs):
            # 导入全局数据库模型变量
            global database
            # 设置全局前端访问的数据库模型变量
            global selectmodels
            # 获取前端访问的数据库模型名称
            dataname = kwargs.get('database')
            # 设置全局变量为前端访问的数据库对象
            selectmodels = database.get(dataname)
            #         后续操作...
            return JsonResponse({})
    
    # 其他文件访问selectmodels 方法
    def getselectmodels():
        global selectmodels
        return selectmodels
    
    1. others.py 这里以 models.py为例
    from mterial.views import getselectmodels
    
    class CategorySerializer(serializers.ModelSerializer):
        #第二个问题:  这里也要写判断, 怎么拿到视图中获取的参数呢?  要改下面的model,把model改成变量,否则得写100遍
        class Meta:
            # Meta 调用全局变量 selectmodels
            selectmodels=getselectmodels()
            if  selectmodels:
                model=selectmodels
            else:
                #你可以在这里做一个错误处理        
                pass
            fields='__all__'
    
    class CategoryFilter(filters.FilterSet):
        id = filters.CharFilter(lookup_expr='exact')
        id_orderticket = filters.CharFilter(lookup_expr='exact')
        order_date_gte = filters.DateFilter(field_name='order_date', lookup_expr='gte')
        order_date_lte = filters.DateFilter(field_name='order_date', lookup_expr='lte')
        project_name = filters.CharFilter(lookup_expr='icontains')
         #第三个问题:  这里还要是要写判断, 来改下面的model,把model改成变量,否则也得写100遍
        class Meta:
            # Meta 调用全局变量
            # Meta 调用全局变量 selectmodels
            selectmodels = getselectmodels()
            if selectmodels:
                model = selectmodels
            else:
                # 你可以在这里做一个错误处理        
                pass
            fields = ['id','id_orderticket','sample_name','order_date_gte','order_date_lte','project_name','is_active']
    
    class CategoryView(ModelViewSet):
        selectmodels = getselectmodels()
        queryset=selectmodels.objects.all()
        serializer_class = CategorySerializer  # 序列化(疑点见下)
        filter_class = CategoryFilter  # 过滤器(疑点见下)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月14日
  • 已采纳回答 11月6日
  • 修改了问题 11月5日
  • 创建了问题 11月5日

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类