Django QuerySet如何按用户输入的多物料名称返回对应价格列表
Django获取对应选择列表的物料价格解决方案
问题原因
你用filter加多个Q条件查询时,数据库只会返回唯一的匹配记录——因为Not Required在表中只有一条,所以哪怕你写两次Q条件,结果里也只会出现一次0,自然得不到四个元素的结果。要实现和用户选择列表一一对应的价格列表,得换个思路。
推荐解决方案:字典映射(简单高效)
先一次性把所有物料的名称和价格缓存成字典,再遍历用户选择的列表逐个匹配,逻辑清晰且只需要一次数据库查询:
# 第一步:获取所有物料的名称-价格映射字典 price_mapping = dict(rawmaterial.objects.values_list('materialName', 'price')) # 第二步:用户选择的物料列表(示例) selected_items = ['Material 3', 'Material 2', 'Not Required', 'Not Required'] # 第三步:生成对应价格列表 result_prices = [price_mapping.get(item, 0) for item in selected_items]
执行后result_prices就是[900, 456, 0, 0],完全符合你的需求。如果遇到字典里没有的物料名称,get方法会返回默认值0,也能兼容异常情况。
备选方案:逐个查询(适合数据量极小场景)
如果物料表数据极少,也可以逐个遍历选择项查询,但这种方式会产生多次数据库请求,不推荐大量使用:
selected_items = ['Material 3', 'Material 2', 'Not Required', 'Not Required'] result_prices = [] for item in selected_items: # 取对应价格,没有则返回0 price = rawmaterial.objects.filter(materialName=item).values_list('price', flat=True).first() or 0 result_prices.append(price)
内容的提问来源于stack exchange,提问作者Mr Bim
相关产品推荐
相关产品推荐

