2010-05-04 44 views
7

Với hai mô hình:Django Aggregation Across Xếp Mối quan hệ

class Profile(models.Model): 
    user = models.ForeignKey(User, unique=True, verbose_name=_('user')) 
    about = models.TextField(_('about'), blank=True) 
    zip = models.CharField(max_length=10, verbose_name='zip code', blank=True) 
    website = models.URLField(_('website'), blank=True, verify_exists=False) 

class ProfileView(models.Model): 
    profile = models.ForeignKey(Profile) 
    viewer = models.ForeignKey(User, blank=True, null=True) 
    created = models.DateTimeField(auto_now_add=True) 

Tôi muốn để có được tất cả các cấu sắp xếp theo tổng số lượt xem. Tôi có thể có được một danh sách các id hồ sơ được sắp xếp theo tổng số lượt xem với:

ProfileView.objects.values('profile').annotate(Count('profile')).order_by('-profile__count') 

Nhưng đó chỉ là một cuốn từ điển của id hồ sơ, có nghĩa là sau đó tôi phải vòng qua nó và đặt cùng một danh sách các đối tượng profile. Đó là một số truy vấn bổ sung và vẫn không dẫn đến QuerySet. Tại thời điểm đó, tôi cũng có thể thả xuống SQL thô. Trước khi tôi làm, có cách nào để làm điều này từ mô hình hồ sơ? ProfileViews có liên quan thông qua một lĩnh vực ForeignKey, nhưng nó không phải là mặc dù mô hình hồ sơ biết rằng, vì vậy tôi không chắc chắn làm thế nào để buộc hai lại với nhau. Ngoài ra, tôi nhận ra rằng tôi có thể lưu trữ các khung nhìn như là một tài sản trên mô hình Profile và có thể trở thành những gì tôi làm ở đây, nhưng tôi vẫn quan tâm đến việc học cách sử dụng các hàm Aggregation tốt hơn.

Trả lời

9

ProfileViews có liên quan thông qua một lĩnh vực ForeignKey, nhưng nó không phải là mặc dù hồ sơ người mẫu đều biết rằng

Các hồ sơ mô hình thực sự không biết điều đó. Bạn sẽ có thể làm điều gì đó như:

Profile.objects.all().annotate(count_views=Count('profileview__pk')).order_by('count_views') 

Sửa: Tại đây bạn có thể tìm thấy tài liệu Django về tra cứu mà span mối quan hệ http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

+0

'từ django.db.models Import Count' – juanjo

3

Chắc chắn điều này sẽ làm việc:

Profile.objects.all().annotate(viewcount=Count('profileview')).order_by('-viewcount') 

Như Botondus nói, mô hình hồ sơ nhận thức được mối quan hệ ngược ngoại khóa.

Các vấn đề liên quan