簡體   English   中英

如何通過相關項的條件聚合對Django查詢集進行排序?

[英]How to sort a Django queryset by a conditional aggregation of related items?

如何使用Django ORM通過相關項的條件聚合對查詢集中的所有對象進行排序? Django 1.8及更高版本顯然有條件聚合支持 ,我需要Django <1.8的答案。 這顯然會涉及3或4個查詢。 以下是回答者可以用來說明她答案的示例模型:

class Group(models.Model):
    owner = models.ForeignKey(User)
    created_at = models.DateTimeField(auto_now_add=True)

class GroupTraffic(models.Model):
    visitor = models.ForeignKey(User)
    which_group = models.ForeignKey(Group)
    time_of_visit = models.DateTimeField(auto_now_add=True)

用戶擁有聊天組,其他用戶可以訪問所述聊天組。 要回答的問題是:如何生成所有組的排序列表,以便按照每個組在過去60分鍾內看到的唯一流量進行排序? 在過去60分鍾內看到大量獨特訪問者的群組被排序到頂部,幾乎為零(或零)此類流量的群組出現在列表的底部。

這是一個條件聚合問題,因為從本質上講,我們需要為每個組對象注釋一個在過去60分鍾內記錄的所有相關的,唯一的grouptraffic對象的Count。

有人可以告訴我如何使用Django ORM解決這個問題<1.8? 我已經知道如何通過條件聚合來實現> = 1.8(感謝這一點 ),我不想通過原始或額外的SQL查詢來實現。

只需過濾time_of_visit正常工作:

one_hour_ago = datetime.now()-timedelta(hours=1)
recent_groups = Group.objects.filter(grouptraffic__time_of_visit>=one_hour_ago)
visitors = recent_groups.annotate(views=Count('grouptraffic__visitor', distinct=True))

然后獲取所有較舊的組,並為空視圖添加一個extra字段:

older_groups = Group.objects.filter(grouptraffic__time_of_visit < one_hour_ago).extra(select={'visits':0})

然后將它們與管道連接在一起:

all_groups = visitors | older_groups 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM