2012-06-14 61 views
0

我想過濾一個項目的_set,但是在下面的問題中,當我這樣做時,它不在我認爲是的字段上。我需要使用rating__rating來獲取帖子表中的評級表的評級列。django嵌套foreignkey設置查詢

在Django

,我有這個:

class Story(models.Model): 
    user = models.ForeignKey(User) 
    ... 

class Post(models.Model): 
    post = models.TextField(max_length=345) 
    story = models.ForeignKey(Story) 
    ... 

class Rating(models.Model) 
    rating = models.IntegerField() 
    post = models.ForeignKey(Post) 

,然後我能找到一個給定的職位,是有一組值的所有評級:

def getPostsForStory(id): 
    return arrangeCountOfRatings(Post.objects.filter(story=id)) 

def arrangeCountOfRatings(postList): 
    for post in postList: 
     post.rateA = post.rating_set.filter(rating=rateA).count() 
    return postList 

但我要如何做到這一點從一個給定的故事?也就是說,我想要應用上述獲取每個帖子計數的過程,但是給定一個Story對象?

def getStoryItemsForUser(request): 
    return arrangeCountOfItems(Story.objects.filter(user=request.user.id) 

def arrangeCountOfItems(storyList): 
    for story in storyList: 
     story.rateA = story.post_set.filter(rating=rateA).count() 
    return storyList 

沒有得到我我想要的(計數都錯了 - 無論是零,如果有與收視率的帖子,1

編輯:

啊,問題是這樣:

story.rateA = story.post_set.filter(rating=rateA).count() 

不搜索我想要的 - 它是在rating__id有效地搜索,而不是rating__rating

所以我只是改變它閱讀rating__rating,簡單。

+2

可能想要考慮將這些'for'循環移入QuerySet中。數據庫擊中速度緩慢。查看[聚合](https://docs.djangoproject.com/en/dev/topics/db/aggregation/)。 –

+0

story.post_set.filter統計帖子數,而不是收視率。看到我的答案。 – Tisho

+1

我同意@Mike。 –

回答

0

什麼:

story.rateA = Rating.objects.filter(rating=ratingA, post__story=story).count() 

編輯:同樣是有效的職位等級(相當於和你的代碼):

post.rateA = Rating.objects.filter(rating=ratingA, post=post).count() 

指定的崗位/故事計數評級。