Django过滤__contains = queryset?

时间:2013-09-04 19:43:20

标签: python django orm filter

我在Ubuntu 13.04上使用Django 1.4.3 w / Python 2.7。我遇到了一个问题,似乎无法找到解决方案。

我有一系列相关模型(通过FK),我需要以复杂的方式过滤它们。

假设我的模型CarParts。我可以将所有部分都设为car.parts_set。每个部分都有一个M2M字段excluded_pricePricerelated_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类型过滤器的功能,该过滤器将值视为对象而不是字符串?

1 个答案:

答案 0 :(得分:1)

如果我正确地按照你的问题,你可以通过迭代地在查询集上建立约束来做到这一点:

parts_set = car.parts_set.exclude(pk=new_part.pk)
price_qs = Price.objects.all()
for part in parts_set:
    price_qs = price_qs.filter(excluded_parts=part)

这将要求最终查询集中的价格包含其excluded_parts字段中parts_set结果的所有部分。他们也可以有其他部分。 price_qs应该最终返回您想要的结果:

  

excluded_pa​​rts是特定汽车零件的超级集合的所有价格

我不知道构建查询的更好方法,要求多对多字段必须包含多个特定值。