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']

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

请求分支