从多对多关系中获取数据以及一个对多对

时间:2018-09-24 21:46:30

标签: django django-models many-to-many one-to-many prefetch

如果我们考虑以下三种模型:客户,公司,联系人。 客户可以从几家公司购买商品,而一家公司有很多客户。此外,公司有几种“联系”类型(电子邮件,传真,电话等)。

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学习查询数据的资源,我会很高兴,因为我发现从SQL中使用django方式确实很困难。

0 个答案:

没有答案