【发布时间】:2013-09-08 11:15:49
【问题描述】:
我在 Ubuntu 13.04 上使用带有 Python 2.7 的 Django 1.4.3。我遇到了问题,似乎找不到解决方案。
我有一系列相关的模型(通过FK),我需要以复杂的方式过滤它们。
假设我有一个模型Car,它有Parts。我可以得到所有的零件car.parts_set。每个部分都有一个M2M字段excluded_price到Price,还有related_name='excluded_prices'。
如果我创建一个新零件,我需要将价格添加到零件的excluded_price,其中每个价格都有与该汽车相关的所有其他零件的excluded_parts。我正在尝试创建一个过滤器来帮助我找到这些价格。
基本上我想要这样的东西:
parts_set = [part for part in car.parts_set.exclude(pk=new_part.pk)]
Price.objects.filter(excluded_parts__contains=parts_set)
实际上,我想找到excluded_parts 是特定汽车零件超集的所有价格(显然不包括新零件)。
如果“parts_set”是一系列字符串,我已经找到了一种很好的方法。
parts_set = [Q(excluded_parts__contains=part) for part in car.parts_set.exclude(pk=new_part.pk)]
Price.objects.filter(reduce(operator.and_, parts_set))
很遗憾,__contains 仅适用于 SQL 语句为 LIKE 的字符串。
Django 的 ORM 中是否有任何功能支持 __contains 类型过滤器,该过滤器将值视为对象而不是字符串?
【问题讨论】:
-
你的意思是像
__in运营商吗? -
不,
excluded_parts是一个超级集合,所以我希望parts_set是__inexcluded_parts,反之亦然。