2012-01-12 45 views
0

是否有可能將下面的sql翻譯成django orm調用還是必須使用raw sql?需要幫助翻譯SQL到ORM調用

感謝您的幫助

我的模型:

 
class Parent(models.Model): 
    slug = models.SlugField()
class Child(models.Model): slug = models.SlugField() parent = models.ForeignKey('Parent') value = models.CharField(max_length=128)

我的SQL:

 
select * 
from parent as p 
    left join child as c on p.id = c.parent_id and c.slug in ('s0','s1','s2') 
where p.id not in (select p.id 
        from parent as p 
        inner join child as c on p.id = c.parent_id and c.slug = 's3' and c.value = 'v3') 
order by p.slug 

回答

0
Parent.objects.filter(child__slug__in=['s0','s1','s2']).exclude(child__slug='s3', child__value='v3').order_by('slug') 

也應該這樣做,但不包括其中child.slug == 'S3',當它不在__in陣列中被包含在首位時是不必要的。

UPDATE

要包括父母沒有子女,以及在你的過濾器中使用Q對象:

from django.db.models import Q 

Parent.objects.filter(Q(child__isnull=True) | Q(child__slug__in=['s0','s1','s2'])) 
+0

感謝,我懷疑這條語句將返回不生孩子的父母,但我確實需要這些父母以及... – akonsu 2012-01-12 17:48:16

+0

請參閱上面的更新。 – 2012-01-12 17:51:00

+0

從此查詢返回的父項中獲取子項會導致額外的數據庫命中。我試圖解決的問題通常被稱爲「backwards select_related()」,我需要讓孩子以及他們的父母(包括沒有孩子的父母),我想在類似的查詢中做類似的事情到我發佈的那個。我在網上看到了一些使用字典等的解決方案,但我發現它們效率低下,因爲它們使用額外的內存來存儲這些關係... – akonsu 2012-01-12 17:57:15