我正在尝试获取与相关清单对象的特定从日期和到日期范围内的所有马对象。例如:
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)