1

現時点では、モデルを視聴している人の数で並べ替えられたアイテムの数を返すクエリセットがあります。したがって、このリンクを表す m2m フィールドがあります。

すなわち:

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

発生回数をカウントし、ビューで使用されるデフォルトのマネージャーでカウント順に並べ替えます。

次に、「notification.ObservedItem」を使用してdjango-notificationを使用し、MyModel の場合にユーザーがインスタンスを監視できるようにします。

私の見解では、ユーザーがコンテンツを投稿すると、次のようなものがあります。

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

これはうまくいきます。

では、クラス MyModel のすべてのオブジェクトを表すクエリセットを生成するにはどうすればよいでしょうか。それらを「観察」している人の数で並べ替えます。

4

2 に答える 2

1

注釈を使用してそれを実現できます。

from django.db.models import Count
MyModel.objects.annotate(num_users=Count('watchers')).order_by('num_users')
于 2012-07-27T13:08:26.577 に答える
1

問題は、django-notification が一般的な外部キーを使用することです。

だから私はウォッチャーフィールドを再定義しました:

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')

docs によると、これはDjangoができないことです。

Django のデータベース集約 API は、GenericRelation では機能しません。

心配しないでください、これはおそらく役立つと思います:

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

レポはここにあります:

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

まだ試していませんが…

于 2012-07-27T15:23:25.557 に答える