Django如何从查询集中返回外键对象?

3

所以我有三个模型

class Post(....

class Project(....

# have a many to many relationship
class ProjectPost(....
    post = ..... # foreignkey
    project = .... # foreignkey

我想选择的数据集是在给定项目对象的情况下,包含Post对象列表。

这是我尝试的代码:

posts_list = ProjectPost.objects.filter(project=project_object).select_related("post")

但是这将返回一系列 ProjectPost 对象而不是 Post 对象。那么正确的做法是什么?

2个回答

4
您可能需要使用ManyToManyField()。
请按照以下方式操作:https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/
class Post(models.Model):
    pass


class Project(models.Model):
    posts = models.ManyToManyField(Post)

如果您想访问项目的帖子,可以执行以下操作:

project_obj.posts.all()

您可以使用所有Queryset方法。

如果您想访问帖子的项目,可以执行以下操作:

post_obj.project_set.all()

与以前一样,您可以使用所有Queryset方法。

如果出于任何原因您想以这种方式操作,您可以这样做:

post_list = ProjectPost.objects.filter(project=project_object).values('post')

当我执行“posts_list = project_object.objects.all()”时,我得到了错误:无法通过Project实例访问Manager。另外,我想获取实际的对象而不仅仅是ID,因此单独使用...values('post')并不是我要找的。 - Derek
完成了,你应该执行 project_obj.posts.all()。抱歉,是我的错(真的,我很抱歉)。 - iferminm

1

最近我自己遇到了这个问题,以下是我的解决方案。希望有人能够评论一下我的解决方案是否有效。

project_posts = ProjectPost.objects.filter(project=project_object).select_related("post")
posts_lists = map(lambda post: project.post, project_posts)

现在,posts_lists中的对象类型已经正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接