zoukankan      html  css  js  c++  java
  • flask多数据查询优化以及二手车信息查询

    flask多数据查询优化以及二手车信息查询

    未经优化的二手车信息查询代码

    在我们之前的cars.py模块下添加字段
    这边是粗略查询,查询用到的字段是品牌(brand)品牌车型(carstyle)和价格(price)


    @api.route('/cars',methods=['get'])
    定义一个列出所有查询数据的方法
    def car_list():
    获得前端传回的品牌查询数据
    brand=request.args.get('brand')
    print(brand)
    获得前端传回的品牌车型查询数据
    carstyle=request.args.get('carstyle')
    print(carstyle)
    获得前端传回的价格查询数据
    price=request.args.get('price')
    新建一个列表用来存储查询出来的对象字典
    ret_data_list=[]
    设置查询条件为都为空,这里没有算上price
    if len(brand)==0 and len(carstyle)==0:
    获得所有car的模型对象
    car_lists=models.Car.query.all()
    这个for中将所有car的模型中需要被查询的字段都取出放到newdict字典里,再把这个字典放到前面的列表中
    for each in car_lists:
    newdict = {}
    brand_obj = each.brand
    获取品牌名称
    newdict['brand'] = brand_obj.brand_name
    获取品牌车型
    newdict['carstyle'] = brand_obj.brand_style
    获取车辆具体信息
    newdict['carstyle_detail'] = brand_obj.brand_style_detail
    获取车辆注册时间
    newdict['car_register_time'] = each.car_register_time
    获取车辆价格
    newdict['price'] = each.price
    获取车辆里程
    newdict['car_distance'] = each.car_distance
    将字典加入列表中
    ret_data_list.append(newdict)

    基本和上面同理,添加了一个判断,这里是用品牌车型查询
    elif len(brand)==0 and len(carstyle)!=0:
    car_lists=models.Car.query.all()
    for each in car_lists:
    添加筛选条件,只输出和用户查询的品牌车型相同的car对象
    if each.brand.brand_style==carstyle:
    newdict = {}
    brand_obj = each.brand
    newdict['brand'] = brand_obj.brand_name
    newdict['carstyle'] = brand_obj.brand_style
    newdict['carstyle_detail'] = brand_obj.brand_style_detail
    newdict['car_register_time'] = each.car_register_time
    newdict['price'] = each.price
    newdict['car_distance'] = each.car_distance
    ret_data_list.append(newdict)

    同样,这里是用品牌查询
    elif len(brand)!=0 and len(carstyle)==0:
    car_lists=models.Car.query.all()
    for each in car_lists:
    添加筛选条件,只输出和用户查询的品牌相同的car对象
    if each.brand.brand_name==brand:
    newdict = {}
    brand_obj = each.brand
    newdict['brand'] = brand_obj.brand_name
    newdict['carstyle'] = brand_obj.brand_style
    newdict['carstyle_detail'] = brand_obj.brand_style_detail
    newdict['car_register_time'] = each.car_register_time
    newdict['price'] = each.price
    newdict['car_distance'] = each.car_distance
    ret_data_list.append(newdict)

    print(ret_data_list)
    return jsonify(data=ret_data_list)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71

    进行查询模拟
    可以看见,虽然我们能够实现查询,但是查询过程中产生了非常多的重复代码,所以我们可以在模块中添加自定义函数添加字段以达到减少字段重复的作用

    优化数据库模型

    由于这是查询的车辆相关信息,我们可以在车辆模型中添加这些字段

    这是车辆关系表模型
    class Car(BaseModel,db.Model):
    __tablename__='sc_cars'
    # id=db.Column(db.Integer,primary_key=True)
    user_id=db.Column(db.Integer,db.ForeignKey('sc_users.id'))
    brand_id=db.Column(db.Integer,db.ForeignKey('brand.id'))
    price= db.Column(db.Integer,default=0,nullable=False)
    car_age=db.Column(db.Integer) #age of the car
    car_style=db.Column(db.String(10))#style of the car
    car_gearbox=db.Column(db.Integer,default=0)#0 for hand,1 for auto
    car_distance=db.Column(db.Integer)
    car_displacement=db.Column(db.Float)
    car_register_time=db.Column(db.DateTime)
    car_num=db.Column(db.String(100))
    car_color=db.Column(db.String(10))
    car_oil_type=db.Column(db.String(10))
    car_emission_standard=db.Column(db.String(10))
    seat_num=db.Column(db.Integer)
    transfer_time=db.Column(db.Integer)
    inspect_annually=db.Column(db.String(10))
    traffic_compulsory_insurance=db.Column(db.String(10))
    commercial_insurance=db.Column(db.String(10))
    images=db.relationship('Carimg',backref='img')
    index_image_url=db.Column(db.String(100))

    orders=db.relationship('Order',backref='orders')
    自定义将查询字段转换为列表的方法,self是Car实例化的模型对象
    def to_list_dict(self):
    # newdict = {}
    # brand_obj = each.brand
    # newdict['brand'] = brand_obj.brand_name
    # newdict['carstyle'] = brand_obj.brand_style
    # newdict['carstyle_detail'] = brand_obj.brand_style_detail
    # newdict['car_register_time'] = each.car_register_time
    # newdict['price'] = each.price
    # newdict['car_distance'] = each.car_distance

    car_obj_dict={
    取出品牌字段
    'brand':self.brand.brand_name,
    取出品牌车型字段
    'carstyle':self.brand.brand_style,
    取出品牌车型细节字段
    'carstyle_detail':self.brand.brand_style_detail,
    取出注册时间字段
    'car_register_time':self.car_register_time,
    取出车辆价格字段
    'price':self.price,
    取出车辆里程字段
    'car_distance':self.car_distance
    }
    返回这个字典,调用该方法时可以取到该字典
    return car_obj_dict

    新的查询字典,用于其他方法
    def to_detail_dict(self):
    new_dict={
    'distance':self.car_distance,
    'index_image_url':self.index_image_url
    }

    return new_dict
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    修改之前的代码为

    from . import api
    from flask import request,jsonify
    from cars.utils.fileimage import upload_file_qiniu
    from cars import constants
    from cars import models,db


    @api.route('/upload_image',methods=['post'])
    def upload_car_image():
    # print(request.form.get('file'))
    try:
    input=request.files.get('file').read()
    car_id=request.form.get('car_id')

    except Exception as e:
    return jsonify(error_code=constants.RETURN_IMAGE_INPUT_ERR,message='aquire message error')
    try:
    img_url=upload_file_qiniu(input)
    except Exception as e:
    return jsonify(error_code=constants.RETURN_IMAGE_UPLOAD_ERR,message='upload message error')

    #todo save our img url to cars img table
    image_lists=models.Carimg.query.filter_by(car_id=car_id).all()
    if len(image_lists)>=30:
    return jsonify(message='too many picture')

    try:
    new_img_url=constants.qiniu_url+img_url
    new_url=models.Carimg(car_id=car_id,url=new_img_url)
    db.session.add(new_url)
    db.session.commit()
    except Exception as e:
    db.session.rollback()
    return 'img save in database error'


    return 'file upload'

    @api.route('/cars',methods=['get'])
    def car_list():
    brand=request.args.get('brand')
    print(brand)
    carstyle=request.args.get('carstyle')
    print(carstyle)
    price=request.args.get('price')
    ret_data_list=[]
    if len(brand)==0 and len(carstyle)==0:
    car_lists=models.Car.query.all()
    for each in car_lists:
    用实例化的Car model对象调用to_list_dict()方法获取新字典
    newdict=each.to_list_dict()
    ret_data_list.append(newdict)


    elif len(brand)==0 and len(carstyle)!=0:
    car_lists=models.Car.query.all()
    for each in car_lists:
    if each.brand.brand_style==carstyle:
    newdict=each.to_list_dict()
    ret_data_list.append(newdict)


    elif len(brand)!=0 and len(carstyle)==0:
    car_lists=models.Car.query.all()
    for each in car_lists:
    if each.brand.brand_name==brand:
    newdict=each.to_list_dict()
    ret_data_list.append(newdict)

    print(ret_data_list)
    return jsonify(data=ret_data_list)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    再次测试

    成功

    模拟添加一个车辆详情页

    由于查询车辆详情只需要查询车辆id就可以,所以逻辑相对来说简单,但是工作量比较大,我这里就只写两个字段测试一下

    @api.route('/car_detail',methods=['get'])
    def car_detail():
    car_id=request.args.get('car_id')
    通过id获得车辆对象
    obj=models.Car.query.get(car_id)
    对象调用后面的to_detail_dict()方法查询定义在里面的两个字段
    ret_dict=obj.to_detail_dict(http://www.my516.com)
    return jsonify(data=ret_dict)
    1
    2
    3
    4
    5
    6
    7
    8

    ---------------------

  • 相关阅读:
    【3】hexo+github搭建个人博客的主题配置
    【2】hexo+github搭建个人博客的简单使用
    每日思考(2020/05/06)
    每日思考(2020/05/05)
    每日思考(2020/03/27)
    文件和异常
    每日思考(2020/03/24)
    图形用户界面和游戏开发
    每日思考(2020/03/19)
    面向对象进阶
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11186722.html
Copyright © 2011-2022 走看看