django相关领域的高效查询集

时间:2015-05-27 09:29:54

标签: django django-queryset

假设您有以下型号

class User:
    pass

class Tag:
    pass

class UserTag: # user is interested in tag
    user = models.ForeignKey(User)
    tag = models.ForeignKey(Tag)

class Blog:
    tags = models.ManyToManyField(Tag)

对于给定的用户,我想通过UserTag

获取用户表达兴趣的所有博客 像是一样的东西 Blog.objects.filter(tags__usertag_set__user = USER_ID)

我可以通过多个步骤完成此操作,但这是最好的方法吗?

user_tags = UserTag.objects.filter(user=user)
result = Blog.objects.none()
for user_tag in user_tags:
    tag = user_tag.tag
    q = tag.blog_set.all()  
    result = result | q

这不可避免地会迭代所有user_tags和坏...

1 个答案:

答案 0 :(得分:0)

你可以做到

user_tags = list(UserTag.objects.filter(creator=user).values_list('id', flat=True))
Blog.objects.filter(tags__in=user_tag)