V
V
Vlad2018-05-28 15:07:41
Django
Vlad, 2018-05-28 15:07:41

How to competently select data from database tables with relationships in Django?

Don't kick me too hard, I'm new to Django and for the first time I'm doing a selection from tables with relationships.
The site has a portfolio page, which is a list of projects, each element of which has several fields, as well as a nested list of pictures for demonstration, which in turn belong to a tag

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='Тег изображения')


How to make a request in a view?
view:
from django.shortcuts import render
from .models import Project, Preview, Tag

def portfolio(arg):

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

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


The received data must be displayed through a loop in the template in this form
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']
},
и т.д.


I understand that you need to use _set but I can't figure it out...

Answer the question

In order to leave comments, you need to log in

2 answer(s)
J
Jock Tanner, 2018-05-28
@Altizo

You understood correctly, for dependent models in the main model, RelatedManagers with the name '<dependent_model>_set' are created. For example, to get the data we are interested in in the console, we can do this:

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)

Accordingly, in order to output everything using a template engine, we need to rewrite it in the language of the template engine:
{% 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 %}

It remains only to pass the model to the context of the template engine:
def portfolio(arg):
    ctx = {
        'project_list': Project.objects.all(),
    }
    return render(arg, 'portfolio.html', ctx)

With tags, everything is the same, did not complicate the answer.

D
Dimonchik, 2018-05-28
@dimonchik2013

if cho, there is always raw
and so - write what you are doing and what is not working

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question