【问题标题】:Django - How define field name for reverse related model in select_relatedDjango - 如何在 select_related 中为反向相关模型定义字段名称
【发布时间】: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 只请求那些必需的字段,而不是全部?

标签: python django


【解决方案1】:

您不必为此做任何特别的事情。直接引用类变量即可:

guides = Guide.objects.select_related("programm", "programm__channel").filter(programm__channel=channel,
    start_date__lte=timezone.now().date()+timezone.timedelta(days=7),
    start_date__gte=timezone.now().date()-timezone.timedelta(days=1))
programms = [guide.programm for guide in guides]
channels = [programm.channel for programm in programms]

请注意,select_related 已修改为缓存查询中的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2020-01-14
    • 2015-06-01
    • 2011-12-27
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多