检查模型实例是否在查询集中进行了 FK 处理



我有一个模型:

class ProjectBookmark(models.Model):
    user = models.ForeignKey(User)
    project = models.ForeignKey('Project')

假设用户正在查看一个项目,有没有办法以某种方式检查当前项目是否在用户书签中,而不是我现在通过请求上下文作为下面的令人讨厌的方式执行此操作?基本上,用户书签是一个项目列表,并检查为

{% 如果current_project在 current_user.书签 %}...

直接从模板内部?

the_user = request.user
bookmarked_projects = list()
for b in ProjectBookmark.objects.filter(user = request.user):
    bookmarked_projects.append(b.project_id)
the_user.bookmarks = Project.objects.filter(id__in=bookmarked_projects)
return {'current_user':request.user}

要直接在模板中使用,最好的方法是创建自定义模板标签。查看模板标签文档。

至于过滤代码本身,为模型定义中的ForeignKey字段提供related_name参数将非常有帮助。例如:

class ProjectBookmark(models.Model):
    user = models.ForeignKey(User, related_name="project_bookmarks")
    project = models.ForeignKey('Project', related_name="bookmarks")

这样,您可以使用request.user.project_bookmarks.all()访问包含所有用户书签的QuerySet对象

最新更新