首页 > 解决方案 > 从多对多关系和单对多关系中获取数据

问题描述

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

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 方式非常困难。

标签: djangodjango-modelsmany-to-manyone-to-manyprefetch

解决方案


推荐阅读