2012-01-12 11 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に含まれていない場合は不要です。

、同様に子を持つ親を含め、あなたのフィルターでQオブジェクトを使用するには

UPDATE:

from django.db.models import Q 

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

おかげで、私はこの文は全く子どもを持たない親を返すことを疑いますしかし、私はこれらの両親も必要です... – akonsu

+0

上記の更新を参照してください。 –

+0

このクエリによって返された親から子を取得すると、追加のデータベースヒットが発生します。私が解決しようとしている問題は、しばしば "backwards select_related()"と呼ばれます。私は子供とその親(子供がいない両親を含む)を取得する必要があります。私が投稿したものまで。私はディクショナリなどを使用するWeb上のいくつかのソリューションを見ましたが、これらの関係を保存するために余分なメモリを使用するため、単に非効率的であることがわかりました... – akonsu

関連する問題