Skip to main content
 首页 » 编程设计

python之django orm : retrieve object and check if it has a relation in one query

2025年05月04日29kenshinobiy

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

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 可以更简单、更优雅地完成吗?

请您参考如下方法:

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

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