Я пытаюсь получить все объекты Horse, которые попадают в определенный диапазон from_date и to_date для связанного объекта списка. например.
Horse.objects.filter(listings__to_date__lt=to_date.datetime,
listings__from_date__gt=from_date.datetime)
Теперь, насколько я понимаю, этот запрос к базе данных создает внутреннее соединение, которое затем позволяет мне найти все мои объекты лошадей на основе соответствующих дат листинга.
Мой вопрос в том, как именно это работает, вероятно, это сводится к серьезному непониманию того, как на самом деле работают внутренние соединения. Должен ли этот запрос сначала «проверить» каждый объект-лошадь, чтобы выяснить, есть ли у него связанный объект списка? Я полагаю, что это может оказаться довольно неэффективным, потому что у вас может быть 5 миллионов объектов-лошадей без связанных объектов списка, но вам все равно придется сначала проверять каждый?
В качестве альтернативы я мог бы начать со своих списков и сначала сделать что-то вроде этого:
Listing.objects.filter(to_date__lt=to_date.datetime,
from_date__gt=from_date.datetime)
А потом:
for listing in listing_objs:
if listing.horse:
horses.append(horse)
Но это тоже кажется довольно странным способом достижения моих результатов.
Если бы кто-нибудь мог помочь мне понять, как работают запросы в Django и какой способ выполнения такого запроса является наиболее эффективным, это было бы большим подспорьем!
Это моя текущая настройка модели:
class Listing(models.Model):
to_date = models.DateTimeField(null=True, blank=True)
from_date = models.DateTimeField(null=True, blank=True)
promoted_to_date = models.DateTimeField(null=True, blank=True)
promoted_from_date = models.DateTimeField(null=True, blank=True)
# Relationships
horse = models.ForeignKey('Horse', related_name='listings', null=True, blank=True)
class Horse(models.Model):
created_date = models.DateTimeField(null=True, blank=True, auto_now=True)
type = models.CharField(max_length=200, null=True, blank=True)
name = models.CharField(max_length=200, null=True, blank=True)
age = models.IntegerField(null=True, blank=True)
colour = models.CharField(max_length=200, null=True, blank=True)
height = models.IntegerField(null=True, blank=True)