【发布时间】:2014-02-06 17:55:36
【问题描述】:
所以,我有这个模型:
class Channel(models.Model):
name = models.CharField(max_length=255, db_index=True)
descr = models.TextField(blank=True)
start = models.DateTimeField()
end = models.DateTimeField()
external_id = models.CharField(blank=True, max_length=64,db_index=True)
class Programm(models.Model):
channel = models.ForeignKey(Channel)
name = models.CharField(max_length=255, db_index=True)
descr = models.TextField(blank=True)
start = models.DateTimeField()
end = models.DateTimeField()
is_live = models.BooleanField(default=False, db_index=True)
class Guide(models.Model):
programm = models.ForeignKey(Programm)
name = models.CharField(max_length=255, db_index=True)
descr = models.TextField(blank=True)
start_date = models.DateField(db_index=True)
start_time = models.TimeField(db_index=True)
duration = models.TimeField(blank=True)
当我需要为一个频道建立电视节目列表时:
Guide.objects.select_related().filter(programm__channel=channel,
start_date__lte=timezone.now().date()+timezone.timedelta(days=7),
start_date__gte=timezone.now().date()-timezone.timedelta(days=1))
Django 执行这样的查询:
SELECT `tvguide_guide`.`id`,
`tvguide_guide`.`programm_id`,
/*here all fields from all tables */
FROM `tvguide_guide`
INNER JOIN `tvguide_programm` ON
(`tvguide_guide`.`programm_id` = `tvguide_programm`.`id`)
INNER JOIN `tvguide_channel` ON
(`tvguide_programm`.`channel_id` = `tvguide_channel`.`id`)
WHERE (`tvguide_programm`.`channel_id` = 1 AND
`tvguide_guide`.`start_date` >= '2014-01-16' AND
`tvguide_guide`.`start_date` <= '2014-01-24' )
ORDER BY `tvguide_guide`.`start_date` ASC, `tvguide_guide`.`start_time` ASC
Django 文档说:
你也可以参考 OneToOneField 中的反向 传递给 select_related 的字段列表——也就是说,你可以遍历一个 OneToOneField 返回到定义字段的对象。 不要指定字段名称,而是使用related_name 作为 相关对象上的字段。
所以...它应该是什么样子???我想不通=(请举个例子。 最后,我有一个如下所示的 SQL 查询:
SELECT `tvguide_guide`.`name`,
`tvguide_guide`.`descr`,
`tvguide_guide`.`start_date`,
`tvguide_guide`.`start_time`,
`tvguide_programm`.`name`,
`tvguide_channel`.`name` FROM ...
【问题讨论】:
-
我尝试这样做:select_related('name','descr','start_date','start_time','programm__name','programm__channel__name') 但它不起作用。
-
您的模型中没有任何 OneToOneFields,所以我对您的实际要求感到困惑。
-
是的,这是我的错 =(... 然而,如何告诉 Django 只请求那些必需的字段,而不是全部?