django orm:检索对象并检查它是否在一个查询中有关系

时间:2013-02-11 20:22:46

标签: python sql django orm

我有一个应用程序,用户可以将帖子设置为他们的最爱。模型定义如下:

class UserProfile(models.Model):  
    user = models.OneToOneField(User)
    favorites = models.ManyToManyField('Post', through='Favorite', related_name='favorited_by')

class Post(models.Model):
    created_by = models.ForeignKey(UserProfile)
    body = models.TextField()

class Favorite(models.Model):
    created_by = models.ForeignKey(UserProfile)
    post = models.ForeignKey(Post)

现在我正在寻找一种简单的方法来查询帖子,同时检查帖子是否被当前用户收藏。目前我正在使用以下,远非优雅的解决方案:

query = """
    SELECT p.id, p.body, p.created_by_id, f.created_by_id AS favorited 
        FROM main_post p LEFT OUTER JOIN main_favorite f
        ON 
            p.id = f.post_id AND     
            f.created_by_id = %s
    """;

posts = Post.objects.raw(query, [request.user.userprofile.id])

这会产生一个名为'favorited'的列,如果帖子不被当前用户收藏,则为null值;如果帖子被收藏,则为当前用户的id。

无论如何,使用django的ORM可以做得更简单,更优雅吗?

1 个答案:

答案 0 :(得分:0)

Django提供的contenttypes framework可能对您的情况有用。并且它也使用通用外键以更优雅的方式完成相同的工作。

**查看https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/上的示例,它们与您要实现的内容非常相似