2012-07-27 66 views
1

我有一個查詢集,在返回按照觀看人數排序的模型中的數量項。所以我有一個代表這個鏈接的m2m字段。django-notification:有多少觀察項目

即:

#models.py 
class MyModel(models.Model): 
... 
watchers = models.ManyToManyField(User, blank=True) 

我會數出現的次數,並通過在默認管理器計數,然後將其使用的視圖命令他們。

現在我要使用django-notification,使用'notification.ObservedItem'來允許用戶觀察一個實例是否MyModel。

所以,在我看來,當一個用戶的帖子有些內容我有這樣的事情:

notification.observe(object, request.user, 'new_object') 

這種運作良好。

現在,我該如何生成一個代表所有MyModel類的所有對象的查詢集,按照人們觀察它們的次數排序呢?

回答

1

可以完成,通過使用註釋:

from django.db.models import Count 
MyModel.objects.annotate(num_users=Count('watchers')).order_by('num_users') 
+0

你說得對,我認爲註釋應該發生在MyModel上,而不是編輯答案。 – 2012-07-27 15:05:30

+0

聖煙你說得對。我很困惑,爲什麼文檔說你不能這樣做,看起來你可以。 – powlo 2012-07-27 16:15:34

+0

FWIW,我用你的第一個模型實現(觀察者是一個M2M)測試了我的代碼,並且運行良好:) – 2012-07-27 16:39:09

1

的問題是,Django的通知使用通用外鍵。

所以我已經重新定義了我的觀察家領域:

watchers = generic.GenericRelation(notification.ObservedItem) 

然後,我可以得到爲MyModel的特定實例的所有觀察者。

$x = MyModel.objects.get(id=1) 
$x.watchers.all() 
$[<ObservedItem: ObservedItem object>, <ObservedItem: ObservedItem object>, <ObservedItem: ObservedItem object>] 
$x.watchers.count() 
$3 

關閉,但沒有雪茄。我想做的事是這樣的:

MyModel.objects.annotate(count=Count('watchers')).order_by('count') 

這是一件好事Django的不能做,according to the docs

Django的數據庫聚合API不能用於GenericRelation。

不用擔心,我想這可能會幫助:

http://charlesleifer.com/blog/generating-aggregate-data-across-generic-relations/

回購是在這裏:

https://github.com/coleifer/django-generic-aggregation

我還沒有嘗試出來呢?