1

我在 Ubuntu 13.04 上使用带有 Python 2.7 的 Django 1.4.3。我遇到了问题,似乎找不到解决方案。

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

假设我有一个Car模型Parts。我可以得到所有的部分car.parts_set。每个部分都有一个 M2M 字段excluded_pricePrice其中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将值视为对象而不是字符串的类型过滤器?

4

1 回答 1

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应该最终返回您想要的结果:

exclude_parts 是特定汽车零件超集的所有价格

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

于 2013-09-04T20:02:37.327 回答