2014-09-13 39 views
4

我有查詢與此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}) 

這給了我下面的查詢Django的模型

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模型

+0

,我想這樣做沒有原始查詢 – Muneeb 2014-09-13 08:52:54

+0

究竟什麼是你想怎麼辦?你是否想用一個布爾值來註釋每個產生的'News'對象,告訴你該行是否'喜歡'? – 2014-09-13 10:11:19

+0

是的...我想要做的事情,但與左外連接 – Muneeb 2014-09-13 10:50:37

回答

3

如果不使用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,))