2011-04-15 40 views
2

我有點困惑於Django的行話。所以我有3個模型:Post,UserProfile(User),Favorite。收藏夾會跟蹤用戶收藏哪些帖子。Django查詢以獲取用戶最喜愛的帖子?

帖子--->收藏< ---用戶/用戶配置

最喜愛的模型:

class Favorite(models.Model): 
    user = models.ForeignKey(User, unique=False) 
    post = models.ForeignKey(Post, unique=False) 

    def __unicode__(self): 
     return self.user.username 

用戶配置模式:

class UserProfile(models.Model) : 
    user = models.ForeignKey(User, unique=True) 

    def get_favorites(self): 
     if self.user: 
      return self.user.favorite_set.all() 

在我post_list鑑於我通過所有帖子到我的模板,並在模板中我有一個for循環顯示所有職位。

{% for post in post_list %} 
<hr/> 
<div id=」post_{{ post.id }}」> 
    {% include 'posts/_post.html' %} 
</div> 
{% endfor %} 

現在,在循環中,我想把一個邏輯,將顯示「收藏」!如果登錄的用戶已經收到郵件。我認爲傳統的SQL是這樣的:

SELECT favorite.post FROM favorite WHERE favorite.user = user.id 

所以,在模板循環我可以做

{% if post in the.above.SQL.query%}Favorited!{% endif %} 

現在我不能把這一對Django的行話出於某種原因。非常感謝您的幫助!

回答

11

需要認識的是,您的Favorite模型實際上是Post和User之間的多對多關係的直通表。如果你在某處聲明瞭一個ManyToManyField,Django實際上可以自動管理它。就個人而言,我會做到這一點對用戶配置 - 這樣的關係卻成爲郵政和用戶配置之間的一個:

class UserProfile(models.Model): 
    favorites = models.ManyToManyField(Post, related_name='favorited_by') 

現在你不需要你get_favorites方法,因爲它通過userprofile.favorites.all()可用。您可以以此爲-是模板:

{% if post in userprofile.favorites.all %}Favorited!{% endif %} 

但是這將最終成爲極其低效的,因爲你會做在您的帖子列表中的每個崗位相同的相同的查詢。因此,使用{% with %}標記循環之前獲得的最愛一次:

{% with userprofile.favorites.all as favorite_posts %} 
    {% for post in post_list %} 
    {% if post in favorite_posts %}Favorited{% endif %} 
    ... 
    {% endfor %} 
{% endwith %} 
+0

工作就像一個神奇魅力。我從來沒有使用ManyToMany,從來沒有過多關注它。現在我明白了!謝謝! – rabbid 2011-04-15 10:56:15

3

儘管丹尼爾是一個很好的點,我就只是張貼你想查詢:)

Post.objects.filter(favorite__user=user) 
+0

oohhh好的!非常感謝你! – rabbid 2011-04-15 12:40:15

相關問題