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()

 

APIView 简单接口编写

上一篇:Delphi SysUtils-SameText 对比两个字符串是否相等


下一篇:WPF摄像头使用(AForge)