Получить данные из множества отношений вместе с одним из многих - PullRequest
0 голосов
/ 25 сентября 2018

Если мы рассмотрим три следующие модели: клиенты, компании, контакты.Клиенты могут приобретать товары у нескольких компаний, а у компании много клиентов.Кроме того, у компании есть несколько «контактных» типов (электронная почта, факс, телефон, ...).

class Clients(models.Model):
    fname= models.CharField(max_length=45, null=False)
    company= models.ManyToManyField(to='Companies', related_name='provider', blank=True)

class Companies(models.Model):
    name= models.CharField(max_length=45, null=False)

class Contacts(models.Model):
    contact= models.CharField(max_length=45)
    type= models.IntegerField(choices=TYPE)
    company= models.ForeignKey(to='Companies', related_name= 'company_contacts', on_delete=models.CASCADE)

Для данного клиента я хотел бы получить информацию о всех компаниях, которые он приобрел, вместе со всеми данными о компании (хранится в модели «Контакты»).В SQL с промежуточной таблицей (clients_companies) я буду делать:

SELECT cl.fname, cp.name, ct.contact, ct.type 
  FROM Clients cl 
  JOIN Clients_Companies cc ON cl.id = cc.clients_id
  JOIN Companies cp ON cp.id = cc.companies_id
  JOIN Contacts ct  ON cp.id = ct.companies_id;

, что даст:

+---------+-----------+-----------------+--------+
| fname   | name      | contact         | type   |
+---------+-----------+-----------------+--------+
| Client1 | Company A | 333-555-1234    | phone  |
| Client1 | Company A | email@email.com | email  |
| Client1 | Company B | 202-555-0191    | phone  |
| Client1 | Company B | 202-555-9999    | fax    |
| Client1 | Company B | arg@arg.com     | email  | 
+---------+-----------+-----------------+--------+

В django я хотел бы что-то похожее на:

data = [
     {'Company A':[{'type':'phone', 'contact':'333-555-1234'},
                  {'type':'email', 'contact':'email@email.com'}],
      'Company B':[{'type':'phone', 'contact':'202-555-0191'},
                   {'type':'fax', 'contact':'202-555-9999'},
                   {'type':'email', 'contact':'arg@arg.com'},],
     }]

Любые предложения по решению этой проблемы приветствуются.Кроме того, если у вас есть источники для изучения запросов к данным с использованием django ORM, я буду очень рад, поскольку мне было очень трудно работать с django при переходе с SQL.

...