我已经用这个查询了 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})
Run Code Online (Sandbox Code Playgroud)
这给了我以下查询
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 )
Run Code Online (Sandbox Code Playgroud)
我想要的是以下查询作为结果
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 )
Run Code Online (Sandbox Code Playgroud)
那么我在查询 Django 模型时必须做什么
LEFT OUTER JOIN如果不使用; 就很难生成这种形式的raw(); 您还需要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,))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1936 次 |
| 最近记录: |