Django查询获取用户最喜欢的帖子?

时间:2011-04-15 09:42:41

标签: django django-models django-templates

我对Django术语有点困惑。所以我有3个型号:Post,UserProfile(User),Favorite。收藏夹会跟踪用户收藏的帖子。

发布--->喜欢< ---用户/用户配置

最喜欢的型号:

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

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

UserProfile模型:

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 %}

现在在for循环中我想放一个显示“收藏!”的逻辑。如果已登录的用户已收藏帖子。我认为传统的SQL是这样的:

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

所以在模板循环中我可以做到

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

现在我出于某种原因无法将其翻译成Django lingo。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:14)

要认识到的是,您的Favorite模型实际上是Post和User之间多对多关系的直通表。如果你在某处声明一个ManyToManyField,Django实际上可以自动管理它。就个人而言,我会在UserProfile上这样做 - 所以这个关系实际上变成了Post和UserProfile之间的关系:

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 %}

答案 1 :(得分:3)

虽然Daniel说得好,但我只会发布您想要的查询:)

Post.objects.filter(favorite__user=user)