Django ManyToMany查询或问题

时间:2014-09-09 08:16:38

标签: django django-models django-orm

我对以下数据有疑问:

Class Car:
    name = ...
    year_price_data = ManyToMany(YearPriceData)

Class YearPriceData:
    year = Integer
    min_price = Integer
    max_price Integer

所以你可以买这辆车:

Ford Focus:
---2014: 25,000$ - 40,000$
---2012: 7000$ - 23,000$

现在,我想查询所有符合特定年价格的汽车:

例如:所有2014年售出的汽车价格范围为18,000-20,000美元

(在我们的例子中不应该返回任何内容,是吗?)

所以这是我所做的查询:

    Car.objects.filter(year_price_data__year=2014)

.filter(Q(year_price_data__min_price__lte=20000,year_price_data__min_price__gte=18000) | Q(year_price_data__max_price__lte = 20000,year_price_data__max_price__gte=18000))

由于OR它返回2012年的行,而它什么都不返回的问题!

所以我的问题是:如何为每个多行创建一个OR查询,这样查询就可以了?

1 个答案:

答案 0 :(得分:2)

首先,我不明白为什么你想要一个ManyToMany关系。虽然汽车可以有许多年度实例,但每年的汽车数据只与一辆汽车有关。因此,正确的关系是从YearPriceData到Car的ForeignKey。

无论哪种方式,您都应该阅读spanning multi-valued relationships上的文档。正如那里所解释的,为了将两个条件都应用于相同的实体,您需要将它们放在同一个过滤器调用中。这应该有效:

Car.objects.filter(year_price_data__year=2014, Q(year_price_data__min_price__lte=20000,year_price_data__min_price__gte=18000) | Q(year_price_data__max_price__lte = 20000,year_price_data__max_price__gte=18000))