?

Log in

No account? Create an account
 
 
27 Сентябрь 2011 @ 19:08
Выборка из двух моделей по совпадению полей.  
День добрый.
Есть такие модели(упрощенный вид):

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

class Person(models.Model):
      name = models.CharField() 
       groups = models.ManyToManyField(Group) 

class Event(models.Model):
      name = models.CharField() 
      groups = models.ManyToManyField(Group) 



 Задача - выбрать имена всех пользователей и событий, для которых совпадают группы в виде

Вася - Изучение python
Вася - Написание hello world
Петя - Изучение python
Петя - Написание системы биллинга

при

"Изучение python" - Группы: 'Обучаемые'
"Написание hello world" - Группы: 'Новички'
"Написание системы биллинга" - Группы: 'Опытные'

Вася - Группы: 'Обучаемые', 'Новички'
Петя - Группы: 'Обучаемые', 'Опытные'

 Если рассматривать задачу со стороны базы данных, группы проще было бы хранить в виде, например, текстовых полей, и выбирать с простым условием 

where p.groups=e.groups

 и тогда она становится тривиальной(именно так было в прошлой реализации интерфейса). 

На текущий же момент объекты примерно такой логики необходимо реализовать на django, и, столкнувшись с задачей, не вижу путей ее решения, кроме банальных for. 
 Буду рад любой подсказке, в т.ч. возможных путей изменения структуры базы.
 
 
 
отражение жизни в экране монитораrainman_rocks on Сентябрь, 27, 2011 17:34 (UTC)
For в цикле - очевидно, зло.
Простой путь решения - это, конечно, hash join.
То есть выбираете персон, строите mapGroupToPersons, выбираете события по group IN (mapGroupToPersons.keys()), потом крутите цикл по событиям и прицепляете к каждому всех персон для всех его групп. Ну или наоборот, через mapGroupToEvents, не суть.

Как это поизящнее слабать средствами Django ORM - даже и не знаю, давно не занималсо.
МалЪчикmordaha on Октябрь, 31, 2011 17:37 (UTC)
нашел решение?
stakan_chayastakan_chaya on Ноябрь, 1, 2011 04:46 (UTC)
Если решать задачу в поставленном виде - помочь может только batch-select -)
specialist_seo on Ноябрь, 16, 2011 10:11 (UTC)
class Event добавить поле OneToOne на Person и сделать обычный фильтр?