Altizo
@Altizo
Начинающий программист

Как грамотно сделать выборку данных из таблиц БД со связями в Django?

Сильно не пинайте я новичок в Django и первый раз делаю выборку из таблиц со связями.

На сайте есть страница портфолио, которая представляет собой список проектов каждый элемент которого имеет несколько полей, а также вложенный в него список картинок для демонстрации, которые в свою очередь относятся к каком у либо тегу
models:
class Tag(models.Model):
    tag_title = models.CharField(max_length=200, verbose_name='Тег')

class Project(models.Model):
    title = models.CharField(max_length=200, verbose_name='Заголовок проекта')
    description = models.TextField(verbose_name='Описание')
    created_date = models.DateTimeField(default=timezone.now, verbose_name='Дата проекта')

class Preview(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, verbose_name='Принадлежность к проекту')
    title = models.CharField(max_length=200, verbose_name='Заголовок изображения')
    image = models.ImageField(upload_to='путь на сервере',  verbose_name='Файл изображения')
    tag = models.ForeignKey(Tag, on_delete=models.DO_NOTHING, blank=True, verbose_name='Тег изображения')


Как составить запрос в view?
view:
from django.shortcuts import render
from .models import Project, Preview, Tag

def portfolio(arg):

    # Вот тут нужна ваша магия

    return render(arg, 'portfolio.html', {})


Полученные данные нужно вывести через цикл в шаблоне в таком виде
template:
{
    'title'         : ['Название проекта 1'],
    'description'   : ['Описание проекта 1'],
    'thumbnail'     : ['Имя изображения 1', 'Имя изображения 2', 'Имя изображения 3'],
    'large'         : ['Имя изображения 1', 'Имя изображения 2', 'Имя изображения 3'],
    'img_title'     : ['Заголовок изображения 1', 'Заголовок изображения 2', 'Заголовок изображения 3'],
    'tags'          : ['Тег изображения 1', 'Тег изображения 2', 'Тег изображения 3']
},
{
    'title'         : ['Название проекта 2'],
    'description'   : ['Описание проекта 2'],
    'thumbnail'     : ['Имя изображения 1', 'Имя изображения 2', 'Имя изображения 3'],
    'large'         : ['Имя изображения 1', 'Имя изображения 2', 'Имя изображения 3'],
    'img_title'     : ['Заголовок изображения 1', 'Заголовок изображения 2', 'Заголовок изображения 3'],
    'tags'          : ['Тег изображения 1', 'Тег изображения 2', 'Тег изображения 3']
},
и т.д.


Я так понял что нужно использовать _set но не могу с этим разобраться...
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
Tanner
@Tanner
Огромный человекоподобный боевой робот
Вы правильно поняли, для зависимых моделей в главной модели создаются RelatedManager'ы с именем ‘<зависимая_модель>_set’. Например, чтобы получить интересующие нас данные в консоли, мы можем сделать так:
for project in Projects.objects.all():
    print('Title: ', project.title)
    print('Description: ', project.description)
    for preview in project.preview_set.all():
        print('\tImage title: ', preview.title)
        print('\tImage path: ', preview.image)

Соответственно, чтобы вывести всё с помощью шаблонизатора, нам нужно переписать это на языке шаблонизатора:
{% for project in project_list %}
    <h2>{{ project.title }}</h2>
    <p>{{ project.description }}</p>
    {% for preview in project.preview_set.all %}
    <h3>{{ preview.title }}</h3>
    <img src="{{ preview.image }}">
    {% endfor %}
{% endfor %}

Остаётся только передать модель в контекст шаблонизатора:
def portfolio(arg):
    ctx = {
        'project_list': Project.objects.all(),
    }
    return render(arg, 'portfolio.html', ctx)

С тегами всё аналогично, не стал усложнять ответ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
если чо, всегда есть raw

а так - пишите, что делаете и что не получается
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы