2013-04-09 244 views
3

所以我有三个型号django从queryset返回外键对象?

class Post(.... 

class Project(.... 

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

数据集我想选择是给定一个Project对象后对象的列表。

这是我的尝试:

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

但这返回ProjectPost对象的列表,而不是发布对象的列表。这样做的正确方法是什么?

回答

2

您可能需要使用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方法DS

如果你想访问一个岗位的项目,你可以做

post_obj.project_set.all() 

以前一样,你可以使用所有的QuerySet方法。

如果你想这样做的任何理由,你可以这样做:

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

当我做了“posts_list = project_object.objects.all()”,我得到了错误:无法通过Project实例访问Manager。另外我想获取实际的对象不仅仅是id,所以... values('post')本身并不是我想要的。 – Derek 2013-04-09 03:21:36

+0

对不起,我犯了一个错误。我现在编辑它。 – israelord 2013-04-09 14:16:26

+0

完成后,您应该执行project_obj.posts.all()。对不起,我的坏(真的,我很抱歉) – israelord 2013-04-09 14:17:33

1

过这个问题来到自己最近,这是我如何解决它。如果有人能评论我的解决方案是否有效,我会喜欢它。

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

posts_lists中的对象现在是正确的类型。