【问题标题】:django orm: retrieve object and check if it has a relation in one querydjango orm:检索对象并检查它是否在一个查询中具有关系
【发布时间】:2013-01-27 00:42:26
【问题描述】:

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

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])

如果帖子未被当前用户收藏,则会生成一个名为“收藏”的列,如果帖子未被收藏,则该列具有空值;如果帖子被收藏,则该列具有当前用户的 id。

使用 django 的 ORM 是否可以更简单、更优雅地完成这项工作?

【问题讨论】:

    标签: python sql django orm


    【解决方案1】:

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

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

    【讨论】:

    • 我不知道怎么做。只有当有不同类型的模型可以标记为收藏时,通用外键才会有用吗?在这个应用程序中,UserProfile 的收藏夹字段只有 Post 模型,不需要不同的模型。
    猜你喜欢
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多