修改接口笔记(python)

启动 admin:

D:\git\runcheng_admin_py>C:\Users\16915\AppData\Local\Microsoft\WindowsApps\python.exe D:\git\runcheng_admin_py\web\app.py

启动 user:

D:\git\runcheng_user>D:\Study\PythonStudy\Python311\python.exe D:\git\runcheng_user\web\app.py

注意:有时候python命令行项目能跑通,但是界面显示接口报404,是因为命令行该端口同时运行了两个项目

修改链接的数据库:在setting->evn.conf.py

①python查看类型使用 type()

1、如何设置页面分页

1、首先前端会传入page,page_size值

后端python修改:

1、定义的函数要给传参page,page_size

2、start_index = page_size * (page - 1): 计算当前页的起始索引,以便正确设置偏移量。

3、total = len(...): 获取符合条件的总记录数,用于后续分页操作中计算总页数或者做其他分页相关的逻辑。

4、sale_objs = ...limit(page_size).offset(start_index).all(): 根据给定的 business_group_id、分页大小 page_size 和起始索引 start_index,查询出相应的 BusinessGroup_user 数据,并限制返回的数量为 page_size,偏移量为 start_index,实现了分页查询的效果。

 start_index = page_size * (page - 1)
        total = len(
            db_session.query(BusinessGroup_user).filter(BusinessGroup_user.business_group_id == business_group_id,
                                                                BusinessGroup_user.status == 1,
                                                                BusinessGroup_user.mc_role_id == 0).all())
        sale_objs = db_session.query(BusinessGroup_user).filter(BusinessGroup_user.business_group_id == business_group_id,
                                                                BusinessGroup_user.status == 1,
                                                                BusinessGroup_user.mc_role_id == 0).limit(
        page_size).offset(start_index).all()

5、给total赋值

return_data["total"] = total

6、在views.py文件中添加page,page_size参数

@app.route('/runchen/admin/getBusinessGroupDetailById', methods=['POST', "GET"])
#@check_login
@not_check_login
def getBusinessGroupDetailById(data):
    params = vld_params_encrypt(
        data,
        {
            'business_group_id:int': {'default': 0},
            'page_size:int': {'default': 10},
            'page:int': {'default': 1},

        })
    params['ip'] = request.headers.get('X-Forwarded-For', '')
    return commission_api.getBusinessGroupDetailById(**params)

2、如何对输入框输入进行模糊查询

#有传参company_name则获取过滤后的总数,没有就获取所有总数
total_query = db_session.query(Company).filter(Company.status == 1)
if company_name:
    total_query = total_query.filter(Company.company_name.like(f"%{company_name}%"))
total = len(total_query.all())

#有传参company_name则获取过滤后数据,没有就获取所有数据
obj_query = db_session.query(Company).filter(Company.status == 1)
if company_name:
    obj_query = obj_query.filter(Company.company_name.like(f"%{company_name}%"))
obj = obj_query.limit(page_size).offset(start_index).all()

绿色是前端传递的参数和后端接受的参数

橙色是数据库Company表里的字段

3、一些细节记录

①创建字典(可以理解为对象)

ret_dict = dict()

dict()是Python中的一个内置函数,用于创建一个新的字典对象。可以用它来创建空字典或从其他可迭代对象(如元组、列表等)生成字典。

ret_dict={ } 和上面的写法等价

②创建列表(可以理解为数组),你可以使用list()函数,如下

mc_roles = list()

mc_roles=[ ] 和上面等价

user_info = db_session.query(User).filter(User.rid == item.rid).first()

first() 方法用于从查询结果中获取第一个匹配的对象,并将其返回。在这种情况下,user_info将包含满足条件的第一个用户对象。

return_data["created_time"] = business_info.created_time.strftime("%Y-%m-%d %H:%M:%S")

.strftime("%Y-%m-%d %H:%M:%S") 是 Python 中用于将日期时间对象格式化为指定格式的字符串的方法。在这里,"%Y-%m-%d %H:%M:%S" 是一个日期时间格式化字符串,具体含义如下:

  • %Y:四位数的年份,如:2024
  • %m:两位数的月份(01-12)
  • %d:两位数的日期(01-31)
  • %H:小时(00-23)
  • %M:分钟(00-59)
  • %S:秒(00-59)

因此,.strftime("%Y-%m-%d %H:%M:%S") 将日期时间对象格式化为类似于 "2024-01-26 15:30:00" 这样的字符串表示形式。

只有这种类型的时间 2023-08-20 22:38:52 需要使用上面的方法转化,而像下面这两种时间就不用:2023-08-20 ,9:00-10:00 AM

4、设计数据库返回结构

接口响应数据结构:

数据库:

python:

def get_food(self,ip, page,page_size):
        result = ApiResult.get_inst()
        db_session = Session()
       
        api_data = {}  # 最外层一级字典

        total=0 #初始化定义赋值
        start_index = page_size * (page - 1)

        fruit_obj=db_session.query(Food).filter(Food.statue == 2).limit(page_size).offset(start_index).all() #过滤出来Food表状态为2的数据
        total=len(fruit_obj) #使用len()方法计算出总长度
        fruit_list = list()   #列表

        if fruit_obj:
            for item in fruit_obj:
                fruit_data = dict()  # 二级字典
                fruit_data["food_id"] = item.food_id 
                detail_data = dict()  # 三级字典
                detail_data["food_name"] = item.food_name
                detail_data["food_price"] = item.price
                detail_data["status"] = item.statue

       ①方法一: fruit_data["detail"] = [detail_data] 
       ②方法二: detail_list = list()
                detail_list.append(detail_data)
                fruit_data["new_detail"]=detail_list 

                fruit_list.append(fruit_data)

        api_data["fruit"] = fruit_list
        api_data["total"] = total

        db_session.close()
        return result.success(data=api_data)

当看到a["x"]=b结构时,a的结构就是字典。

当看到c.append()方法时,c的结构就是列表。.append() 方法是列表类型(list)的方法,用于向列表末尾添加新元素。

暂时不理解)什么时候需要定义在循环外,什么时候需要定义在循环内

另外:

  1. fruit_data["detail"] = [detail_data]: 这种写法会将 detail_data 放在一个列表中,作为值赋给键 "detail"。即使 detail_data 本身是一个字典,也会被放在列表中,形成类似 [detail_data] 的结构。

  2. fruit_data["detail"] = detail_data: 这种写法直接将 detail_data 作为值赋给键 "detail",不会放在列表中。所以,如果 detail_data 本身就是一个字典,那么 fruit_data["detail"] 就会是这个字典,而不是一个包含这个字典的列表。

5、多表连接查询 join

①当表字段名一致时

fruit_obj = db_session.query(Food.food_id,Food.food_name, Food.price,Fruit.color).join(Fruit, Food.food_id == Fruit.food_id).filter(
    Fruit.statue == 2).all()

query()的时候需要指定查询的表的字段 ,如果需要在查询结果中包含某个字段,该字段必须在查询中被指定。否则,如果尝试访问查询结果中未包含的字段,就会导致报错。

但是连接查询时,只会过滤出相同含义字段里面是相同的值的数据

另外,query查询时,里面必须是“表名.字段名”,不能是笼统的一张表名

②当表字段名不一致,但是字段含义一致时,可以在查询时使用 label() 方法为字段指定别名,然后在结果中使用这些别名来访问字段的值

fruit_obj = db_session.query(Food.food_id.label('id'),Fruit.fruit_id.label('id'),Food.food_name, Food.price,Fruit.color).join(Fruit, Food.food_id == Fruit.fruit_id).filter(
    Fruit.statue == 2).all()

下面引用赋值时也是使用别名

if fruit_obj:
    for item in fruit_obj:
        fruit_data = dict()  
        fruit_data["food_id"] = item.id

6、if判断语句

if "资讯" not in tab:
    # 如果 tab 不包含 "资讯",执行相应的操作
    pass
else:
    # 如果 tab 包含 "资讯",执行其他操作
    pass

 模糊查询判断

if tab.find("资讯") == -1:
    # 如果 tab 中不包含 "资讯" 字符串,执行相应的操作
    pass
else:
    # 如果 tab 中包含 "资讯" 字符串,执行其他操作
    pass

在上面的示例中,find() 方法会返回子字符串在字符串中的索引,如果未找到,则返回 -1。因此,通过判断返回值是否为 -1,你可以确定是否包含 "资讯" 子字符串。 

7、注意:

在数据库中,NULL 值表示缺失或未知的值,而在 Python 中,NULL 值对应的是 None。因此,当您在 Python 中对数据库进行过滤时,您应该使用 None 来表示空值,而不是 NULL。

就是说空值在数据库用NULL表示,在python中用None表示

8、转换为字符串类型

在JavaScript中,转换为字符串类型通常使用 .toString()方法

在Python中,可以使用 str()函数将对象转换为字符串类型

9、query.append() 方法只接受一个参数

下面是错误示例:query.append(Reservation.link_rid == link_rid, Reservation.status != 1)

可以使用 and_() 函数将这多个过滤条件连接起来 

正确示例:query.append(and_(Reservation.link_rid == link_rid, Reservation.status != 1))

使用 append 方法将一个列表添加到另一个列表中会导致嵌套列表,而使用 extend 方法则会将列表中的元素扁平地添加到另一个列表中。

list1 = [1, 2, 3]
list2 = [4, 5, 6]

list1.append(list2)  # 嵌套列表
print(list1)         # 输出: [1, 2, 3, [4, 5, 6]]

list1 = [1, 2, 3]
list2 = [4, 5, 6]

list1.extend(list2)  # 扁平地添加元素
print(list1)         # 输出: [1, 2, 3, 4, 5, 6]

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值