Django ORM filter then join on the same column
Совсем недавно познакомился с Django, немного заблудился...
Моя цель : Я эти модели :
class IndicatorValue(models.Model):
my_obj = models.ForeignKey("MyObject", on_delete=models.CASCADE)
type = models.IntegerField()
value = models.FloatField( null=True, blank=True, db_index=True)
class MyObject(models.Model):
date = models.DateTimeField("start_date", db_index=True)
Я хочу получить список IndicatorValue (значение и тип) для объекта MyObject, который:
- has date > X
- has one indicator value of type Y that is above Z
Что бы я сделал на SQL:
В SQL я бы сделал что-то вроде :
SELECT iv2.type, iv2.value
FROM MyObject m
JOIN IndicatorValue iv1 on m.pk = iv1.object_pk and iv1.type = Y and iv1.value > Z
JOIN IndicatorValue iv2 on iv1.object_pk = iv2.object_pk
WHERE m.date > X
Что я делаю
Мне удалось сделать это с помощью цикла следующего содержания:
values_ok = IndicatorValue.objects.filter(type=Y).filter(value__gt=Z)
for val in values_ok:
print(val.my_obj.indicator_set.all())
но это чрезвычайно медленно, поскольку я предполагаю, что каждый val.my_obj.indicator_set.all() берет данные из базы данных.
Как мне получить все нужные мне данные одним махом ANDкак мне получить к ним доступ?
(иногда я видел, что при регистрации sql-запросов выполняется двойное соединение, но при этом создается псевдоним таблицы - например, T5 - и я не знаю, как добраться до этих данных).
Спасибо!