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

博客围绕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)

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

优化数据库模型

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

这是车辆关系表模型
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

修改之前的代码为

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)

再次测试
在这里插入图片描述
成功

模拟添加一个车辆详情页

由于查询车辆详情只需要查询车辆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()
    return jsonify(data=ret_dict)

查询结果
在这里插入图片描述
完成测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值