如何在Odoo API中限制res.partner模型的返回记录数量?
实现Odoo API返回指定数量的餐厅记录
要实现仅返回指定数量的符合筛选条件的餐厅记录,可利用Odoo ORM的search方法自带的limit参数,同时支持从请求参数中接收自定义条数,具体修改如下:
1. 新增条数限制参数处理逻辑
在代码开头添加逻辑,读取请求传递的limit参数,若未传递则使用默认值(如50),同时做参数合法性校验:
# 获取返回条数限制,默认返回50条 limit = kwargs.get('limit', 50) # 确保limit为合法正整数,避免非法值报错 try: limit = int(limit) if limit <= 0: limit = 50 except (ValueError, TypeError): limit = 50
2. 在search方法中传入limit参数
修改原代码的search调用,将limit参数传入,限制返回的记录数量:
restaurants = restaurants.sudo().search(filter_domain, limit=limit)
完整修改后的代码
@http.route('/api/get-restaurant-list', type='json', methods=['POST', 'GET'], auth='public') def get_restaurant_list(self, **kwargs): restaurants = request.env['res.partner'] filter_domain = [('usertype', '=', 'restaurant')] # --- 新增:处理返回条数限制 --- limit = kwargs.get('limit', 50) try: limit = int(limit) if limit <= 0: limit = 50 except (ValueError, TypeError): limit = 50 # --- 新增结束 --- if 'filter_by' in kwargs: filters = kwargs.get('filter_by') for k in filters: if k == 'available_food' or k == 'country_name' or k == 'state_name' or k == 'district_name': if k == 'available_food': filter_domain.append((k + '.name', 'in', filters.get(k))) if k == 'country_name': country_name = filters[k] filter_domain.append(('country_id.name', '=', country_name)) if k == 'state_name': state_name = filters[k] filter_domain.append(('state_id.name', '=', state_name)) if k == 'district_name': district_name = filters[k] filter_domain.append(('district_id.name', '=', district_name)) else: filter_domain.append((k, '=', kwargs.get('filter_by').get(k))) if 'search' in kwargs: filter_domain.append(('name', 'ilike', kwargs.get('search'))) # --- 修改:添加limit参数到search方法 --- restaurants = restaurants.sudo().search(filter_domain, limit=limit) # --- 修改结束 --- restaurant_list = [] for r in restaurants: val = { "id": r.id, "name": r.name, "email": r.email, "mobile": r.mobile, "street": r.street, "street2": r.street2, "zip": r.zip, "city": r.city, "state_id": r.state_id.id, "state_name": r.state_id.name, "country_id": r.country_id.id, "country_name": r.country_id.name, "district_id": r.district_id.id, "district_name": r.district_id.name, "opening_time": r.time, "available_food": [a.name for a in r.available_food], "food_menus": [ {"id": fm.id, "name": fm.name, "price": fm.price, "description": fm.description} for fm in r.menu_ids], "location": { "lat": r.partner_latitude, "long": r.partner_longitude }, "rating_avg": r.get_avg_rating(), "image": _generate_image_path(model=r._name, id=r.id, field='image_1920') } restaurant_list.append(val) data = {"success": True, "data": restaurant_list} return data
使用说明
- 前端调用API时,可通过
limit参数自定义返回条数:GET请求直接拼在URL后(如/api/get-restaurant-list?limit=30),POST请求则在JSON参数中加入"limit": 30。 - 若需要实现分页,可进一步添加
offset参数(如offset=50表示跳过前50条记录),只需在search方法中同时传入offset=offset即可。
内容的提问来源于stack exchange,提问作者Nahid Jawad Angon
相关产品推荐
相关产品推荐

