Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 28, 2023 13:55:16

san7667
Зарегистрирован: 2023-08-17
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровневое соединение таблиц ORM

Добрый день!
Я новичок в Django и столкнулся с проблемой..
Остряков и метателей на сайт с документацией (я там смотрел уже) убедительная просьба сдержаться и просто не отвечать на мой глупый вопрос!

Вопрос:
Как соединить несколько таблиц в формате:
А к B + B к С связанные между собой поэтапно, в одном queryset?
Детально представлено на скриншоте..
Знаю про select_related, но там соединение “родительская-дочерняя”, мне нужно поэтапно соединить 3 таблицы..

Хочу что то типа такого:

 SELECT ..., konkursants.fio
FROM konkurs_result
LEFT JOIN konkurs_k ON (konkurs_k.id=konkurs_result.konkurs_k_id)
LEFT JOIN konkursants ON (konkursants.id=konkurs_k.konkursants_id)

Отредактировано san7667 (Сен. 28, 2023 14:16:54)

Прикреплённый файлы:
attachment 2023-09-28_16-52.png (78,4 KБ)

Офлайн

#2 Сен. 28, 2023 14:52:13

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2586
Репутация: +  60  -
Профиль   Отправить e-mail  

многоуровневое соединение таблиц ORM

Полагаю описание ваших моделей и как вы строите запрос мы должны угадать?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Сен. 28, 2023 15:04:23

san7667
Зарегистрирован: 2023-08-17
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровневое соединение таблиц ORM

ZerG
Полагаю описание ваших моделей и как вы строите запрос мы должны угадать?

Models.py

 class Konkurs_result(models.Model):
    konkurs = models.ForeignKey('Konkurs', on_delete=models.CASCADE, blank=True, null=True) 
    konkurs_j = models.ForeignKey('Konkurs_j', on_delete=models.SET_NULL, null=True, blank=True )
    konkurs_k = models.ForeignKey('Konkurs_k', on_delete=models.SET_NULL, null=True, blank=True)
    konkurs_tour = models.ForeignKey('Konkurs_tour', on_delete=models.SET_NULL, null=True, blank=True)
    ocenka = models.CharField('Оценка', max_length=100)
    dop_info = models.TextField('Дополнительная информация', null=True, blank=True)

 class Konkurs_k(models.Model):
    konkurs= models.ForeignKey('Konkurs', on_delete=models.CASCADE, blank=True, null=True)
    konkursants = models.ForeignKey('Konkursants', on_delete=models.CASCADE)

 class Konkursants(models.Model): 
    fio = models.CharField('ФИО', max_length=70)
    doljn = models.CharField('Должность', max_length=100,null=True, blank=True)
    otdel = models.TextField('Отдел', null=True, blank=True)
    dop_info = models.TextField('Дополнительная информация', null=True, blank=True)
    image=models.ImageField(verbose_name='Фото', upload_to='gallery/',blank=True, null=True)
    date_reg = models.DateTimeField(auto_now_add=True)

Views.py

 class konkurs_resultSelect(LoginRequiredMixin,generic.ListView):
    model = Konkurs_result
    template_name = 'main/form_konkurs_result.html'
    context_object_name = 'konks_result'
    paginate_by = 4
    def get_queryset(self): 
        return Konkurs_result.objects.filter(konkurs_tour=self.kwargs['pk'],konkurs=self.kwargs['pk2']).select_related('konkurs','konkurs_k','konkurs_j','konkurs_tour')

Отредактировано san7667 (Сен. 28, 2023 15:07:47)

Офлайн

#4 Сен. 29, 2023 06:38:11

san7667
Зарегистрирован: 2023-08-17
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

многоуровневое соединение таблиц ORM

Я так понимаю этот раздел мертвый, но может кому пригодиться:
Решение:
Поэтапное соединение таблиц:

 queryset = konkurs_result.objects.select_related('konkurs_k','konkurs_k__konkursants')

Отредактировано san7667 (Сен. 29, 2023 06:39:11)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version