【问题标题】:Django Custom Left Outer JoinDjango 自定义左外连接
【发布时间】:2014-11-07 08:01:15
【问题描述】:

我已经用这个查询了 Django 模型

news = News.objects.filter(Q(likes__user__isnull=True)|Q(likes__user=user))
.extra(select={"is_liked":NewsLikes._meta.db_table+".user_id = %d" % user.id})

这给了我以下查询

SELECT (shows_newslikes.user_id = 143) AS `is_liked`, * FROM `shows_news` 
LEFT OUTER JOIN `shows_newslikes` ON ( `shows_news`.`id` = `shows_newslikes`.`news_id`)
WHERE (`shows_newslikes`.`user_id` IS NULL OR `shows_newslikes`.`user_id` = 143 )

我想要的是以下查询作为结果

SELECT (shows_newslikes.user_id = 143) AS `is_liked`, * 
FROM `shows_news` LEFT OUTER JOIN `shows_newslikes` ON ( `shows_news`.`id` = 
`shows_newslikes`.`news_id` and `shows_newslikes`.`user_id` = 143 ) WHERE 
(`shows_newslikes`.`user_id` IS NULL  )

那么我必须在查询 Django 模型中做什么

【问题讨论】:

  • 我想在没有原始查询的情况下做到这一点
  • 你到底想做什么?你想用一个布尔值来注释每个结果 News 对象,告诉你该行是否被“喜欢”?
  • 是的......我想要做的,但是用左外连接

标签: django


【解决方案1】:

不使用raw(),很难生成这种形式的LEFT OUTER JOIN;您还需要distinct() 重复行。我会使用EXISTS,它更干净而且可能更快:

news = News.objects.extra(select={'is_liked':
    'EXISTS (SELECT 1 FROM {tbl_2} '
    'WHERE {tbl_2}.news_id = {tbl}.id AND {tbl_2}.user_id = %s)'.format(
        tbl=News._meta.db_table,
        tbl_2=NewsLikes._meta.dbtable)}, select_params=(user.id,))

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2016-10-29
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2021-01-30
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多