2010-12-19 52 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') 

如何使返回所有帖子與作者foo和唯一的評論在每個帖子的comment_set也由富做了一個查詢。

回答

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