Django模型含ManyToMany字段,如何不获取对象直接获取所有ID?
高效获取多对多关联ID的方法
针对你给出的Django模型结构,要避免获取完整Topping对象来拿ID,有两种高效的方式:
使用
values_list直接查询ID字段
这是最简洁的方案,Django ORM会生成仅查询id列的SQL语句,完全不会实例化Topping对象:list(pizza.toppings.values_list('id', flat=True))values_list('id', flat=True)返回一个包含所有关联Topping ID的迭代器,转成列表即可直接使用。直接查询多对多中间表
若需要更底层的操作,可以直接访问Pizza和Topping之间的中间关联表(默认命名为pizza_toppings,自定义中间表则用你指定的模型),查询其中的topping_id字段:list(Pizza.toppings.through.objects.filter(pizza_id=pizza.id).values_list('topping_id', flat=True))这种方式性能和第一种相当,但写法更繁琐,一般优先推荐第一种。
对比你原来的写法,这两种方式都只会从数据库获取ID数值,不会加载完整的Topping对象,能明显减少内存占用和数据库查询开销,适合对性能有要求的场景。
内容的提问来源于stack exchange,提问作者Lodewijck
相关产品推荐
相关产品推荐

