2014-02-18 4 views
0

У меня есть модель под названием «Проекты».Как выбрать конкретный связанный элемент в Django?

Проекты могут быть представлены. Если они есть, они будут отображаться на главной странице (Projects.filter (is_featured = True))

Каждый проект содержит несколько слайдов. Эти слайды могут быть представлены (Slide.is_featured = True) и содержать модель изображения, которая содержит фактическое изображение.

На моей домашней странице я хотел бы отобразить слайд-шоу, в котором каждый слайд содержит имя проекта и изображение, содержащееся в избранном слайде.

Я сделал это, добавив метод «featured_slide()» в моей модели проекта, но теперь я понимаю, что каждый раз нажимаю на БД, и я хотел бы улучшить это, используя «select_related» ' заявление.

Как я могу это сделать?

Оптимально, я хотел бы иметь поле типа 'featured_slide' для представления слайда.

я думал сделать что-то вдоль этих линий:

Projects.filter(is_featured=True).annotate(featured_slide='slides__is_featured=True').select_related(slides__image) 

Я знаю, что это не может быть так просто (slides__is_featured не поле базы данных), но вы получите идею.

ответ

2

Если вы хотите слайд-шоу только тех Slides, которые сами по себе являются признакам, а также имеющие отношение к признакам Projects:

class Project(...): 
    name = models.CharField() 
    is_featured = models.BooleanField() 

class Slide(...): 
    project = models.ForeignKey(Project) 
    is_featured = models.BooleanField() 
    image = models.ImageField() 

для запроса слайдов (с помощью select_related, чтобы избежать ненужных запросов):

slides = Slide.select_related("project").filter(is_featured=True, project__is_featured=True) 

и шаблон:

<ul> 
    {% for slide in slides %} 
     <li><img src="{{ slide.image.url }} /><span class="caption">{{ slide.project.name }}</caption></li> 
    {% endfor %} 
</ul> 

EDIT:

Если вы хотите найти reverse relationship (т. получить все слайды для проекта), по умолчанию вы можете сделать следующее:

project = Project.objects.get(...) 
project_slides = project.slide_set.all() 

Вы добавляете _set к названию модели. Вы можете сделать это более интуитивным, добавив атрибут related_name к отношениям:

class Slide(...): 
    project = models.ForeignKey(Project, related_name="slideshow_slides") 

и теперь используют:

project = Project.objects.get(...) 
project.slideshow_slides.all() 
+0

Damn: о выборе соответствующих проектов. Это блестяще, я бы никогда об этом не думал Есть ли способ ссылки на слайды через проекты? Большая часть кода в шаблонах уже написана, и я хотел бы избежать переписывания. – XelharK

+0

Да, для ссылки на слайды из проекта вы можете найти * обратное * отношение (в документации Django есть материал). Я отредактировал ответ –

+0

Но разве обратный поиск не запускает другой запрос?Я понимаю, что это не так, когда я использую оператор select_related, но если мне нужен только признак слайда, как мне фильтровать слайд-набор без запуска другого запроса? – XelharK

Смежные вопросы