2014-02-08 44 views
0

我已经通过环顾四周,有似乎没有任何东西已经确切地回答我所期待的,使用下面的模式,我想加入的所有表:
加入多个表在Django

class A(models.Model): 
    name = models.CharField(max_length=60) 

class B(models.Model): 
    a = models.ForeignField(A) 

class C(models.Model): 
    a = models.ForeignField(A) 

class D(models.Model): 
    a = models.ForeignField(A) 

这是结构的一个非常基本的那种我有事情,我想加入基于有外键链接答:我已经看过select_related上的所有表,但好像那就是我想要的东西,以相反的方向这样做是因为它将一个对象链接到它所引用的对象,并且我想根据引用它的内容来加入它。

基本上我想加入这样的MySQL查询表:
SELECT * FROM A, B, C, D WHERE A.id = B.aID AND A.id = C.aID AND A.id = D.aID;

回答

0

您可以使用a custom join你的目的:

# assume our models.py contains the following 
class Contact(models.Model): 
    name = models.CharField(max_length=255) 
    phones = models.ManyToManyField('Phone') 
    addresses = models.ManyToManyField('Address') 

class Phone(models.Model): 
    number = models.CharField(max_length=16) 

# join as follows 
contacts = Contact.objects.extra(
    select={'phone': 'crm_phone.number'} 
).order_by('name') 

# setup intial FROM clause 
# OR contacts.query.get_initial_alias() 
contacts.query.join((None, 'crm_contact', None, None)) 

# join to crm_contact_phones 
connection = (
    'crm_contact', 
    'crm_contact_phones', 
    'id', 
    'contact_id', 
) 
contacts.query.join(connection, promote=True) 

# join to crm_phone 
connection = (
    'crm_contact_phones', 
    'crm_phone', 
    'phone_id', 
    'id', 
) 
contacts.query.join(connection, promote=True) 

洗涤,漂洗,重复,每对表,直到你”重新开心。如果涉及太多,您可以始终使用custom SQL