我对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。非常感谢您的帮助!
答案 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)