【问题标题】:Django annotate queryset depending on another queryDjango根据另一个查询注释查询集
【发布时间】:2017-07-09 15:34:02
【问题描述】:
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>
 )

是否可以使用注释/聚合来做上述事情,一般来说最有效的方法是什么?

【问题讨论】:

    标签: python django aggregation


    【解决方案1】:

    问题在于注释发生在数据库 (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()
    

    【讨论】:

    • 谢谢你,我开始使用你的方法,它使我的代码更整洁。很遗憾,我不知道你可以做 qs.something = something ,太可怕了。
    【解决方案2】:

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

    from django.db.models import Exists, OuterRef
    user_wishlist = Wishlist.objects.filter(item_id=OuterRef('id'), user=user)
    items = TradeItem.objects.annotate(in_wishlist=Exists(user_wishlist))
    

    PS:我知道,老问题...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2017-07-14
      • 2014-12-22
      • 1970-01-01
      相关资源
      最近更新 更多