zoukankan      html  css  js  c++  java
  • APIView 简单接口编写

    View.py

    from ast import literal_eval
    
    import snowflake.client  # 雪花算法存id
    
    from rest_framework.response import Response
    from rest_framework.views import APIView
    
    from opportunity_market.checkresult import CheckResult
    from opportunity_market.models import BusOpportunityFollow, BusOpportunitySetting
    from opportunity_market.my_pagination import MyPagination
    from opportunity_market.serializers import OpportunitySearchSerializer, BusOpportunityFollowSerializer, 
        BusOpportunitySettingSerializer
    from read_db_app.models import GboOdsBusOpportunity
    
    
    class OpportunitySearch(APIView):
    
        def get(self, request):     # 只接收get请求
            keyword = request.GET.get('keyword')
            country = request.GET.get('country_code')
            post_time_type = request.GET.get('post_time_type')
            quantity_type = request.GET.get('quantity_type')
            page = request.GET.get('page', 1)
            user_id = request.GET.get('user_id')
            if keyword.strip() == '':
                return Response(CheckResult.check('关键词为空, 请求失败'))
            # 发布时间筛选
            if post_time_type == '1':
                post_datetime = (datetime.datetime.now() - datetime.timedelta(hours=12))
                post_time = time.mktime(post_datetime.timetuple())
            elif post_time_type == '2':
                post_datetime = (datetime.datetime.now() - datetime.timedelta(days=1))
                post_time = time.mktime(post_datetime.timetuple())
            elif post_time_type == '3':
                post_datetime = (datetime.datetime.now() - datetime.timedelta(days=3))
                post_time = time.mktime(post_datetime.timetuple())
            elif post_time_type == '4':
                post_datetime = (datetime.datetime.now() - datetime.timedelta(weeks=1))
                post_time = time.mktime(post_datetime.timetuple())
            else:
                post_time = 0
    
            if quantity_type == '1':
                quantity_min = 1
                quantity_max = 100
            elif quantity_type == '2':
                quantity_min = 100
                quantity_max = 1000
            elif quantity_type == '3':
                quantity_min = 1000
                quantity_max = float("inf")  # 无穷大
    
            if country == '':
                opp_data = GboOdsBusOpportunity.objects.filter(bo_subject__icontains=keyword, post_time__gte=post_time,
                                                                   quantity__gte=quantity_min, quantity__lte=quantity_max)   # __icontains: 忽略大小写模糊查询‘%s%’, __gte:大于等于, __lte:小于等于
            else:
                opp_data = GboOdsBusOpportunity.objects.filter(country_en_name__icontains=country, bo_subject__icontains=keyword,
                                                                   post_time__gte=post_time, quantity__gte=quantity_min,
                                                                   quantity__lte=quantity_max)
            mypage = MyPagination()
            page_roles = mypage.paginate_queryset(queryset=opp_data, request=request, view=self)   # 设置返回列表每页数据条数
            serializer_data = OpportunitySearchSerializer(instance=page_roles, many=True).data    # 序列化每页的取到的数据
    
            bo_id_list = [li.get('bo_id') for li in serializer_data]
    
            res = BusOpportunityFollow.objects.filter(bo_id__in=bo_id_list, user_id=user_id).only('bo_id')   # .only():经取回‘bo_id’字段的值
            bus_ser = BusOpportunityFollowSerializer(res, many=True).data
    
            for data in serializer_data:
    
                if data.get('bo_id') in [bus_bo_id.get('bo_id') for bus_bo_id in bus_ser]:    # 给序列化后,返回前端前的列表中的每条数据添加一个key:value值
                    data.update({'follow_type': '1'})
                else:
                    data.update({'follow_type': '2'})
    
            result = {
                'errcode': 0,
                'errmsg': '请求成功',
                'total': opp_data.count(),
                'page': page,
                'data': serializer_data
            }
            return Response(result)   # Rsponse 返回到前端
    
    class buyerRecommendSetting(APIView):
        """商机推荐设置"""
    
        def post(self, request):
            user_id = request.POST.get('user_id')
            setting_value = request.POST.get('settting_value')
    
            try:
                s_values = literal_eval(setting_value)
            except:
                return Response(CheckResult.check('格式错误'))
            else:
                for value in s_values[0].values():
                    if value.strip() == '':
                        return Response(CheckResult.check('存在推荐关键词为空,请求失败'))
                res = BusOpportunitySetting.objects.filter(user_id=user_id)
                if not res:
                    setting_id = snowflake.client.get_guid()    # 雪花算法存id
                    create_time = datetime.datetime.now()
                    BusOpportunitySetting.objects.create(setting_id=setting_id, user_id=user_id,
                                                     settting_value=setting_value, create_time=create_time)   # 创建一条数据到数据库  
    
                else:
                    res.update(settting_value=setting_value)     # 更新一条数据库指定字段数据
    
                result = {
                    'errcode': 0,
                    'errmsg': '提交成功'
                }
                return Response(result)
    
    
    class OpportunityFollowSave(APIView):
    
        def post(self, request):
            user_id = request.POST.get('user_id')
            bo_id = request.POST.get('bo_id')
            follow_type = request.POST.get('follow_type')
            res = BusOpportunityFollow.objects.filter(user_id=user_id, bo_id=bo_id)   # 过滤筛选
            if not res:
                if follow_type == '1':
                    follow_id = snowflake.client.get_guid()
                    create_time = datetime.datetime.now()
                    BusOpportunityFollow.objects.create(follow_id=follow_id, user_id=user_id, bo_id=bo_id,
                                                        create_time=create_time)   # 创建一条数据到数据库  
                        # (注:.create创建后,可以不用res.save(),因为创建相当于已经保存数据到数据库了,再save()可能就是保存了两次进数据库)
                elif follow_type == '2':
                    BusOpportunityFollow.objects.filter(user_id=user_id, bo_id=bo_id).delete()    # 数据库删除指定的一条数据
                else:
                    return Response(CheckResult.check('关注状态传入错误'))
                return Response({'errcode': 0, 'errmsg': '操作成功', })
            else:
                return Response(CheckResult.check('已关注'))

    重写pagination设置页数:

    my_pagination.py
    from rest_framework import pagination
    
    
    class MyPagination(pagination.PageNumberPagination):
        page_size = 10   # 每页数目
        page_query_param = 'page'
        page_size_query_param = 10  # 前端最多能涉及的每页数量

    关于雪花算法模块:

    # 安装:pip install pysnowflake
    
    # 启动:snowflake_start_server
         # snowflake_start_server --address=127.0.0.1 --port=8910 --dc=1 --worker=1
    # 引入
    import snowflake.client
    # 应用
    guid = snowflake.client.get_guid()
  • 相关阅读:
    [BZOJ3257]树的难题
    [BZOJ4987]Tree
    [NOI2015][洛谷P2150]寿司晚宴
    P2221 [HAOI2012]高速公路
    BUG全集(我遇到的)
    NOIP2018游记
    BZOJ1103
    Google Chrome 优化
    特殊空格
    Ant Design Vue 使用
  • 原文地址:https://www.cnblogs.com/Vera-y/p/12971694.html
Copyright © 2011-2022 走看看