Django-Notification:観測されたアイテムの数
-
12-12-2019 - |
質問
私は、それを見ている人の数が注文したモデル内の数項目を返す瞬間にクエリセットを持っています。だから私はこのリンクを表すM2Mフィールドを持っています。
IE:
#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のすべてのオブジェクトを表すクエリセットを生成する方法は?
解決
注釈を使用してそれを達成することができます:
from django.db.models import Count
MyModel.objects.annotate(num_users=Count('watchers')).order_by('num_users')
. 他のヒント
問題は、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ができないものである
Djangoのデータベース集約APIは一般的なものでは機能しません。
心配しない、私はこれがおそらく助けになると思います:
http://charresLeifer.com/blog/generating-aggregate. -Data - Generic Relations /
レポはここにあります:
https://github.com/coleifer/django-generic-aggregation < / P>
まだ試してはいけません...