You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:55:24