【发布时间】:2015-06-22 07:54:37
【问题描述】:
我正在尝试获取相关列表对象上特定 from_date 和 to_date 范围内的所有 Horse 对象。例如。
Horse.objects.filter(listings__to_date__lt=to_date.datetime,
listings__from_date__gt=from_date.datetime)
现在,据我了解,此数据库查询创建了一个内部联接,然后使我能够根据相关的上市日期找到我所有的马对象。
我的问题是这究竟是如何工作的,这可能归结为对内部连接的实际工作方式缺乏了解。此查询是否需要首先“检查”每个马对象以确定它是否具有相关的列表对象?我想这可能会证明效率很低,因为您可能有 500 万个马对象而没有相关的列表对象,但您仍然必须先检查每一个?
或者,我可以从我的列表开始,先做这样的事情:
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)
【问题讨论】:
标签: django django-models inner-join django-queryset django-orm