Django如何在select\u related中定义反向相关模型的字段名

2024-09-25 12:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我有这个模型:

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)

当我需要为一个频道建立电视节目列表时:

^{pr2}$

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文档显示:

You can also refer to the reverse direction of a OneToOneField in the list of fields passed to select_related — that is, you can traverse a OneToOneField back to the object on which the field is defined. Instead of specifying the field name, use the related_name for the field on the related object.

所以。。。它应该看起来怎么样???我想不出=(请举个例子。 最后,我有一个SQL查询,如下所示:

 SELECT `tvguide_guide`.`name`, 
        `tvguide_guide`.`descr`, 
        `tvguide_guide`.`start_date`, 
        `tvguide_guide`.`start_time`, 
        `tvguide_programm`.`name`,
        `tvguide_channel`.`name` FROM ...

Tags: thenameidtruedbdateindexmodels
1条回答
网友
1楼 · 发布于 2024-09-25 12:26:07

你不必为此做什么特别的事。直接引用类变量:

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被修改为缓存查询中的值。在

相关问题 更多 >