2012-07-27 4 views
1

현재보고있는 사람들의 숫자로 정렬 된 모델의 항목 수를 반환하는 쿼리 세트가 있습니다. 그래서이 링크를 나타내는 m2m 필드가 있습니다.django-notification : 관찰 된 항목의 수

즉 :

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

나는 사건의 수를 계산 한 다음 뷰에서 사용 된 기본 관리자의 수에 의해 그들을 주문한다.

이제 'notification.ObservedItem'을 사용하여 사용자가 MyModel 인스턴스를 볼 수 있도록 django-notification을 사용하려고합니다. 이 잘 작동

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

: 사용자의 게시물 일부 콘텐츠가 나는 이런 식으로 뭔가를 내보기에 그래서

.

이제 MyModel 클래스의 모든 객체를 나타내는 queryset을 '관측하는 사람들의 수로 정렬하여 어떻게 생성 할 수 있습니까?

답변

1

당신은 주석을 사용하여 해당 작업을 수행 할 수 있습니다

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

맞아요. 대신 주석을 편집하는 대신 MyModel에서 주석이 발생해야한다고 생각합니다. –

+0

네가 옳은 거룩한 연기 야. 나는 문서가 당신이 할 수있는 것처럼 보일 때 그것을 할 수 없다고 말하는 이유에 대해 혼란 스럽다. – powlo

+0

FWIW, 첫 번째 모델 구현 (관찰자가 M2M이 됨)으로 코드를 테스트하고 잘 작동했습니다. –

1

문제는 장고 - 통지는 일반적인 외래 키를 사용합니다.

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 

가까운 시가가 없습니다. 이 같은 내가하고 싶었을했다 :

장고, according to the docs을 할 수없는 무언가가
MyModel.objects.annotate(count=Count('watchers')).order_by('count') 

.

Django의 데이터베이스 집계 API는 GenericRelation과 작동하지 않습니다.

내가이 아마 도움이 될 것입니다 생각, 걱정하지 :

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

리포는 여기에 있습니다 : 나는 아직 그것을 시도하지했습니다

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

...