Django根据另一个查询注释查询集

时间:2017-02-20 11:17:51

标签: python django aggregation

class TradeItem(models.Model):
    ...

class Wishlist(models.Model):
    user = models.ForeignKey(User, related_name='wishlist_user')
    item = models.ForeignKey(TradeItem, related_name='wishlist_item')

我需要使用一个项目是否在此用户的心愿单中的布尔值来注释TradeItem查询集。像

这样的东西
items = TradeItem.objects.all().annotate(wishlist=
 <heresy>
 if Wishlist.objects.filter(user=request.user, item={current_item}: 
  True 
 else: 
  False
 </heresy>
 )

是否可以使用注释/聚合来执行上述操作,一般来说最有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

这个问题是注释发生在数据库(SQL)级别上。您只能使用SQL方言本身支持的函数(如SUM,AVG ...)。如果要追加任意属性/数据字段,则应迭代查询集并对每个实例单独检查:

items = TradeItem.objects.all()
user_wishlist = Wishlist.objects.filter(user=request.user)
for item in items:
    item.wishlist = user_wishlist.filter(item=item).exists()

答案 1 :(得分:0)

可以使用Exists在单个查询中实际上在数据库级别解决此问题:

make -d

PS:我知道,老问题了……