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

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

posted @ 2019-07-15 04:29  水至清明  阅读(323)  评论(0编辑  收藏  举报