2013-12-03 5 views
0

У меня есть проблема, я не знаю, как это сделать внутреннее соединение (без необработанного SQL) в Python/Django ...питон - внутреннее соединение 3 класса

Это мои классы:

class A(models.Model): 
    parameter1 = models.CharField() 

class B(models.Model): 
    parameter1 = models.CharField() 
    a = models.ForeignKey(a) 

class C(models.Model): 
    parameter1 = models.CharField() 
    b = models.ForeignKey(b) 

Как я могу иметь тот же результат, используя только Джанго, как этот запрос:

query = A.objects.raw('SELECT * FROM A INNER JOIN B ON A.id=B.a_id INNER JOIN C ON B.id=b_id') 

Благодаря

+0

Вы прочитали https://docs.djangoproject.com/ru/dev/topics/db/queries/? – akaRem

+0

Вы спрашиваете то же самое, что и здесь? http://stackoverflow.com/questions/610891 – akaRem

+0

Я читаю ваши сообщения, но это не та же проблема, что и моя. – Raphael

ответ

1

Вы могли бы использовать isnull или любые другие полевые поиски, чтобы ограничить данные из A:

q = A.objects.filter(b__isnull=False, b__c__parameter1__isnull=False) 

результат запроса будет похож на это:

SELECT "appname_A"."id", "appname_A"."parameter1" FROM "appname_A" 
INNER JOIN "appname_B" ON ("appname_A"."id" = "appname_B"."a_id") 
INNER JOIN "appname_C" ON ("appname_B"."id" = "appname_C"."b_id") 
WHERE ("appname_C"."parameter1" IS NOT NULL AND "appname_B"."id" IS NOT NULL) 
ORDER BY "appname_A"."id" ASC 

и вы должны использовать select_related из C (обратной), если вы хотите выберите все данные в одном запросе из объединенных таблиц:

q = C.objects.filter(b__a__parameter1=SOMETHING).select_related() 

результат запроса начнется с:

SELECT "appname_C"."id", "appname_C"."parameter1", "appname_C"."b_id", 
     "appname_B"."id", "appname_B"."parameter1", "appname_B"."a_id", 
     "appname_A"."id", "appname_A"."parameter1" 
INNER JOIN ... 
Смежные вопросы