2014-01-17 1 views
0

그래서, 나는이 모델이 select_related에 반대 관련 모델에 대한 필드 이름을 정의하는 방법 :장고 -

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) 

내가 TV의 목록을 작성할 필요가 하나 개의 채널을 보여줍니다

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)) 

장고 수행을 같은 쿼리

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 

장고 문서는 말한다 :

012 또한 select_related에 전달 분야의 목록에서 OneToOneField의 반대 방향으로 참조 할 수 있습니다 3,516,

- 그건 당신이 필드가 정의 된 오브젝트로 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 ... 
+0

나는 그렇게 할 시도 start_time ','programm__name ','programm__channel__name ')하지만 작동하지 않습니다. – hloroform

+0

You 모델에 OneToOneFields가 없으므로 실제로 묻는 것에 대해 혼란스러워합니다. –

+0

네, 이것은 제 잘못 = (... 그렇지만 장고에게 필요한 필드 만 요청하는 방법은 무엇입니까? – hloroform

답변

0

그냥 참조 직접 클래스 변수에 :. ', select_related ('이름 ','DESCR ','시작일 ': select_related 쿼리의 값을 캐시하도록 수정

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] 

공지 것을