2016-12-14 3 views
0

Предположим, у меня есть следующие три модели, как показано ниже: Я хочу создать запрос модели Django для архивирования того же эффекта, что и следующий оператор SQL.Django model internal join ORM issues

SQL заявление

select B.value, C.special 
from B inner join C 
where B.version = C.version and B.order = C.order; 

я получил следующие три модели:

class Process(models.Model): 
    name = models.CharField(max_length=30) 
    description = models.CharField(max_length=150) 

class ProcessStep(models.Model): 
    process = models.ForeignKey(Process) 
    name = models.CharField(max_length=30) 
    ... 
    order = models.SmallIntegerField(default=1) 
    version = models.SmallIntegerField(null=True) 

class Approve(models.Model): 
    process = models.ForeignKey(Process) 
    content = models.CharField(max_length=300) 
    ... 
    version = models.SmallIntegerField(null=True) 
    order = models.SmallIntegerField(default=0) 

Я хочу, чтобы найти все Утверждает, которые имеют один и тот же (версия, порядок) соответствия кортежа от модели ProcessStep ,

+0

Как эти две модели, связанные друг с другом? – AKS

+0

Две модели имели те же поля (версия, заказ), с которыми я хочу сопоставлять. Отфильтровать записи ** Одобрить **, который имеет ту же комбинацию (версия, заказ). – shady

+0

Что я имею в виду, это те, которые связаны с одним и тем же «процессом» или нет? – AKS

ответ

0

Что-то вроде этого?

Approve.objects.filter(process__processstep_set__order=<value>) 
+0

Я не думаю, что это работает для меня ~ – shady

0

В настоящее время я могу выйти только с помощью исходного SQL-кода, см. Следующий код.

from django.db import connection 
cursor = connection.cursor() 
cursor.execute(" 
SELECT A.id, B.id 
from approval_approve as A inner join approval_approvalstep as B 
where A.process_id = B.process.id 
    and A.order = B.order 
    and A.version = B.version;") 
# do something with the returned data 

Если вы, ребята, есть какие-либо лучшее решение, я хотел бы услышать от вас, спасибо ~