Фильтрация перед присоединением к django orm

У меня есть три воображаемые модели:

 class Singer(BaseModel):
    singer_name = models.CharField(max_length=50, db_index=True)
    album  = ForeignKey(album, on_delete=models.CASCADE, null=True,
                         related_name="singer_album")

 class Album(BaseModel):
    album_name = models.CharField(max_length=50, db_index=True) 

 class Fan(BaseModel):
    fan_name = models.CharField(max_length=50, db_index=True) 
    admired_singer = ForeignKey(Singer, on_delete=models.CASCADE, null=True,
                         related_name="fan_singer")

Теперь, допустим, я хочу запросить всех певцов + альбомы, начинающиеся с 'g', которые принадлежат певцу, которым восхищался фанат 'RSNboim'.

моя интуиция подсказывает, что надо идти как

queryset = Fan.objects.values('admired_singer','album_name').filter(fan_name = 'RSNboim', album_name__startswith='g')

и теперь мой главный вопрос

В моей реальной БД около 6M записей, поэтому я хотел бы заставить Django выполнять filter перед выполнением оператора join, потому что это отнимает больше сил сначала объединить и только потом фильтровать по критериям.

будет ли вставка filter() перед values() фактически выполнять фильтрацию перед объединением? или у Django/Postgres есть свой собственный способ определения порядка операций?

После вызова values() можно вызвать filter(), order_by() и т.д., что означает, что эти два вызова идентичны:

Blog.objects.values().order_by('id')
Blog.objects.order_by('id').values()

Об этом говорится в официальной документации django. Поскольку это ссылка в хроме, я не могу вставить ее.

https://docs.djangoproject.com/en/4.0/ref/models/querysets/#:~:text=Finally%2C%20note%20that%20you,).values()

Откройте ссылку в chrome, чтобы перейти к выделенному разделу, или вы можете поискать текст, который я разместил на сайте django.

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