【问题标题】:django return foreign key object from queryset?django 从查询集中返回外键对象?
【发布时间】:2013-04-09 02:49:01
【问题描述】:

所以我有三个模型

class Post(....

class Project(....

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

我要选择的数据集是给定 Project 对象的 Post 对象列表。

这是我尝试过的:

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

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

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    您可能想要使用 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()”时,出现错误:无法通过项目实例访问管理器。此外,我想获取实际对象而不仅仅是 id,所以 ...values('post') 本身并不是我想要的。
    • 完成,您应该执行 project_obj.posts.all()。对不起,我的错(真的,我很抱歉)
    【解决方案2】:

    我自己最近遇到了这个问题,这就是我解决它的方法。如果有人可以评论我的解决方案是否有效,我会很高兴。

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2021-10-14
      • 2014-01-08
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2018-08-06
      相关资源
      最近更新 更多