Опитвам се да получа всички обекти 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)