2

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

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”的列,如果该帖子未被收藏,则该列具有空值;如果该帖子被收藏,则该列具有当前用户的 id。

无论如何,这可以使用 django 的 ORM 更简单、更优雅地完成吗?

4

1 回答 1

0

Django 提供了可能对您有用的内容类型框架。它还使用通用外键以更优雅的方式完成相同的工作。

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

于 2013-02-11T20:43:24.930 回答