2010-12-19 5 views
1

サンプルコードDjangoは:関連するモデル上の制約を使用してクエリを作成し

class Person(models.Model): 
    name = models.CharField(max_length=100) 

class Post(models.Model): 
    author = models.ForeignKey(Person) 
    content = models.TextField() 

class Comment(models.Model): 
    post = models.ForeignKey(Post) 
    author = models.ForeignKey(Person) 
    content = models.TextField() 


foo = Person.objects.create(name='foo') 
bar = Person.objects.create(name='bar') 

blog = Post.objects.create(author=foo,content='Random Blog 1') 
blog2 = Post.objects.create(author=foo, content='Radom Blog 2') 

c1 = Comment.objects.create(post=blog, author=foo, content='Comment on blog1') 
c2 = Comment.objects.create(post=blog, author=bar, content='Bar comment on blog1') 
c3 = Comment.objects.create(post=blog2, author=foo, content='Comment on blog2') 
c4 = Comment.objects.create(post=blog2, author=bar, content='Bar comment on blog2') 

どのように私はすべてのポストの各ポストのcomment_setで著者fooとだけコメントのでもfooということで作られていますを返すクエリを作るのですか。私はおそらくこのようなものとなるだろう

答えて

0

from django.db.models import Count, F 

    Post.objects.filter(author=foo 
     ).annotate(comment_count=Count('comment_set') 
     ).filter(comment_set__author=foo # 
     ).annotate(foo_comment_count=Count('comment_set') 
     ).filter(foo_comment_count=F('comment_count'))) 

別のアプローチは、fooその後、他の誰かがコメントした後、PKではない、そのセット内のすべてを選択した記事を選択するために、サブクエリだろう。

DjangoのORMを使用したクエリの作成は、SQLクエリの作成とあまり変わりありません。最後の手段として、いつもraw queryと書くことができます。

関連する問題