2012-10-30 42 views
32

Tôi có hai mô hình được xác định lỏng lẻo như thế này:Django chú thích đếm với một lĩnh vực riêng biệt

class InformationUnit(models.Model): 
    username = models.CharField(max_length=255) 
    project = models.ForeignKey('Project') 
    ... 

class Project(models.Model): 
name = models.CharField(max_length=255) 

Giờ đây, trong một lần xem, tôi muốn chú thích tất cả các InformationUnits thuộc về một dự án, do đó, tôi làm điều này:

p = Project.objects.all().annotate(Count('informationunit') 

mà hoạt động giống ok Hơn nữa, tôi muốn biết, trong từng dự án, có bao nhiêu khác biệt 'username' tham gia. Tức là, hãy đếm số lượng 'tên người dùng' khác nhau có trong InformationUnits để soạn một dự án. Tôi đã thử những điều sau đây, nhưng nó chỉ đơn giản là đếm số InformationUnit, không phụ thuộc vào username:

p = Project.objects.all().annotate(Count('informationunit__username') 

Lưu ý rằng tên người dùng không phải là một đối tượng, nó là một chuỗi. Có cách nào hay không để làm điều này hoặc tôi nên tạo một mã phức tạp hơn dựa trên các vòng lặp và mã spaghetti: P

Cảm ơn rất nhiều!

Trả lời

54

Count có thể mất một lập luận distinct, như vậy:

p = Project.objects.all().annotate(Count('informationunit__username', 
             distinct=True)) 

này dường như không được ghi chép lại, nhưng bạn có thể tìm thấy nó trong nguồn cho Count.

+0

Nó hoạt động! Tôi đã tìm thấy nơi này và thậm chí đã thử nó (thực sự đó là điều cuối cùng tôi đã làm trước khi đặt câu hỏi ở đây). Ban đầu nó không hoạt động, nhưng đã thử nó một lần nữa ngày hôm nay sau khi khởi động lại máy chủ phát triển và nó đã làm các trick: P Cảm ơn rất nhiều! – fenomenoxp

+0

Nó được ghi lại (bây giờ, dù sao): https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.Count.distinct –

6
Project.objects.all().annotate(Count('informationunit__username', 
            distinct=True)) 
+0

cho rằng để làm việc, không nên USERNAME phải là một lĩnh vực của dự án? – fenomenoxp

+0

Đã thử nó, nhưng nó không thành công vì tên người dùng không phải là một lĩnh vực của dự án – fenomenoxp

+0

Có thể xác nhận điều này làm việc với django 1.7 – rix

6

Nếu bạn chỉ muốn đếm giá trị khác biệt, bạn có thể sử dụng riêng biệt() và count() chức năng:

count = Project.objects.values('informationunit__username').distinct().count() 
+0

Cảm ơn bạn, đây là những gì tôi đang tìm kiếm cho. Câu trả lời được chấp nhận trả về một danh sách các đối tượng. Giải pháp của bạn làm việc cho tôi. – allardbrain

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