LINUX.ORG.RU

Выбрать все записи A, связанные с какими-либо записями B через B.manytomanyfield

 ,


0

2

Модель:

class People(models.Model):
    name=models.CharField

class Recordings(models.Model):
    title=models.CharField
    performers=models.ManyToManyField(People)
Нужно выбрать всех исполнителей, т. е. все записи людей People, которые хоть раз встречаются в поле performers какой-либо аудиозаписи Recordings.
На SQL это можно сделать так:
SELECT * FROM people WHERE id IN (SELECT DISTINCT people_id FROM recordings_people)
Или так:
SELECT DISTINCT * FROM recordings_people JOIN people ON recordings_people.people_id=people.id
Как сделать это нормально средствами Django ORM?

★★

Последнее исправление: shatsky (всего исправлений: 2)

Попробуй так - people = Recordings.people_set.all()

pi11 ★★★★★
()
Ответ на: комментарий от winlook38

Есть, только в данном случае это не поможет, или можно сделать raw sql запрос - выбрать все записи из таблицы связывающей People и Recordings а потом уже in.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

Во-первых, на джанговском орм можно написать такую же по смыслу конструкцию, как и ваш первый sql-запрос. Во-вторых, результат raw sql-запроса, если я не ошибаюсь, может быть представлен джанговсим ормом. Сорри, я какую-то чушь пишу - пива перепил. Но первое свое предложение я могу оформить завтра, когда посмотрю как это в моих проектах было реализовано (сейчас синтаксис не вспомню, а заново разбираться лень), а второе предложение более точно сформулирую, когда протрезвею.

winlook38 ★★
()
Ответ на: комментарий от winlook38

Во-первых, на джанговском орм можно написать такую же по смыслу конструкцию, как и ваш первый sql-запрос.

Мой первый «sql-запрос» и есть конструкция джанговского ОРМ. Поэтому не понятно, что ты имел ввиду.

Во-вторых, результат raw sql-запроса, если я не ошибаюсь, может быть представлен джанговсим ормом.

Можно, но смысла и профита от этого особого нет.

pi11 ★★★★★
()

People.objects.filter(name__in=Recordings.objects.values('performers')) вот че-то типа такого. Но здесь ошибки, допиши сам.

winlook38 ★★
()
Ответ на: комментарий от pi11

почему нет смысла и профита? ты делаешь extra и получаешь результат обернутый в объекты, как будто ты сделал запрос из самого orm'а.

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

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

trashymichael ★★★
()

Пиши на SQL. Если посмотреть что там городит Django ORM, то тебе плохо станет :) Нормально средствами Django кроме как SELECT * FROM foo WHERE bar=1 ничего не сделаешь.

xpahos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.