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, который:

  1. has date > X
  2. 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 - и я не знаю, как добраться до этих данных).

Спасибо!

Вернуться на верх