【问题标题】:django: Better implementation of LEFT JOINdjango:更好地实现 LEFT JOIN
【发布时间】:2017-09-28 20:04:39
【问题描述】:

我有两个模型,

class Post(models.Model):
    id = models.IntegerField(primary_key=True)
    post_title = models.CharField()
    post_type = models.CharField() 

class Comments(models.Model):
    id = models.IntegerField(primary_key=True)
    post = models.ForeignKey(Post, related_name="post_comments")
    comment = models.CharField()
    user_id = models.IntegerField()

我想获取带有 post_type "blog" 的 "all" 帖子以及特定用户的 cmets。如果使用原始查询进行,查询将是这样的,

SELECT p.id as post_id, p.post_title, pc.comment 
FROM Post p 
LEFT JOIN Comments pc ON (p.id=pc.post AND pc.user_id=20)
WHERE p.post_type='blog'

上述查询将返回所有 post_type 为“blog”的帖子以及 user_id 为 20 的 cmets。如何在 django 中使用 Post 对象过滤器来实现这一点?

我试过下面的方法,但是没用。

queryset = Post.objects.filter(post_type='blog', post_comments__user_id=20).all()

我用谷歌搜索了很多,但我找不到一个好的解决方案。

【问题讨论】:

    标签: python django django-models django-queryset django-orm


    【解决方案1】:

    你看过这个吗? https://docs.djangoproject.com/en/1.11/topics/db/queries/#spanning-multi-valued-relationships?

    如果您打印,您可以看到原始 sql django 运行的内容: str(Post.objects.filter(post_type='blog', post_comments__user_id=20).query)

    我猜你需要使用这个: Post.objects.filter(post_type='blog').filter(post_comments__user_id=20)

    【讨论】:

    • 我不想打印查询,我想使用django对象过滤方式获取数据。
    • 我明白了,您可以打印查询以进行调试,看看 sql django 使用该过滤器生成了什么。
    • 打印内部连接查询。
    【解决方案2】:

    如果您想将所有post_type 作为“博客”返回,并将commentsuser_id 20 返回,那么您可以执行此查询

    from django.db.models import Q
    
    Post.objects.filter(Q(post_type='blog') | Q(post_comments__user_id=20))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2017-04-04
      • 2011-08-22
      • 2021-06-25
      • 1970-01-01
      • 2010-12-21
      • 2022-01-09
      相关资源
      最近更新 更多