django:更好地实现LEFT JOIN

时间:2017-05-01 11:43:37

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

我有两个型号,

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”的“所有”帖子以及特定用户的评论。如果使用原始查询,查询将是这样的,

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的评论。如何使用django中的Post对象过滤器实现此目的?

我尝试了波纹管方法,但它没有用。

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

我google了很多,但我找不到一个好的解决方案。

2 个答案:

答案 0 :(得分:0)

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

如果打印,您可以看到原始sql django运行的内容: import Data.List parseIntList :: String -> [Int] parseIntList s = [read x :: Int | x <- words s] type Polinom = [Int] scriePolinom :: Polinom -> String .... main = do a <- getLine let intlist = parseIntList a putStrLn $ scriePolinom intlist

我的猜测是你需要使用这个: str(Post.objects.filter(post_type='blog', post_comments__user_id=20).query)

答案 1 :(得分:0)

如果您要将所有post_type作为“博客”退回,将comments退回user_id 20,则可以执行此查询

from django.db.models import Q

Post.objects.filter(Q(post_type='blog') | Q(post_comments__user_id=20))