Как сказал Марцин в другом ответе, вы можете развернуть отношения, используя двойной синтаксис подчеркивания. Тем не менее, вы также можете их связывать, и иногда это может быть легче понять логически, хотя это приводит к появлению большего количества строк кода. В вашем случае, хотя, я мог бы сделать что-то, что будет выглядеть следующим образом:
первых вы хотите узнать цену на дату х:
a = Product.objects.filter(price_history__date = somedate_x)
вы, вероятно, следует проверить, чтобы увидеть, если есть более чем один на сегодняшний день :
if a.count() == 1:
pass
else:
do something else here
(или что-то в этом роде)
Теперь у вас есть цена, и вы знаете дату, так что просто сделать это:
b = Product.objects.filter(price_history__date__lt = somedate, price_history__price__gt=a[0].price)
Знайте, что срез попадет в базу данных самостоятельно и вернет объект. Таким образом, этот запрос попадет в базу данных три раза за вызов функции, один раз для подсчета, один раз для среза и один раз для фактического запроса. Вы можете отказаться от счета и среза, выполнив совокупную функцию (например, среднее значение по всем возвращенным строкам за день), но они могут стать дорогими по своему усмотрению.
для получения дополнительной информации см QuerySet API:
https://docs.djangoproject.com/en/dev/ref/models/querysets/