将子查询和CASE转换为Django ORM

时间:2015-07-21 17:10:37

标签: django orm

我使用MS SQL SERVER作为Django DATABASE(使用pyodbc django模块)

有两个表,项目和最喜欢的项目

如何将以下查询转换为Django ORM

SELECT item_id,
    CASE WHEN 
        item_id IN (SELECT item_id FROM FavoriteItem WHERE user_id='test_user')
        THEN 1
        ELSE 0
    END as is_favorite_item 
FROM Item

两个模型已经在models.py中定义为ItemModel和FavoriteItemModel

我知道有一些替代方法可以使用'raw','@property decoration'等来解决这个问题。

但是,我想知道是否有机会使用纯Django ORM来解决这个问题。

谢谢,

1 个答案:

答案 0 :(得分:1)

自己回答。

from django.db.models import Case, When, Value, BooleanField

favorite_items = FavoriteItem.objects.filter(user_id='test_user')
items = Item.objects.annotate(
          is_favorite_item=Case(
            When(item_id__in=favorite_items.values('item_id'), then=True),
          default=Value(False),
          output_field=BooleanField()))