Фильтрация перед присоединением к 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.