Tôi cần điền vào mẫu có bản tóm tắt hoạt động của người dùng trong một hệ thống nhắn tin đơn giản. Đối với mỗi người gửi thư, tôi muốn số lượng thư được gửi và số người nhận riêng biệt.Phiên bản Django ORM của SQL COUNT (DISTINCT <column>)
Dưới đây là một phiên bản đơn giản của mô hình:
class Message(models.Model):
sender = models.ForeignKey(User, related_name='messages_from')
recipient = models.ForeignKey(User, related_name='messages_to')
timestamp = models.DateTimeField(auto_now_add=True)
Đây là cách tôi muốn làm điều đó trong SQL:
SELECT sender_id, COUNT(id), COUNT(DISTINCT recipient_id)
FROM myapp_messages
GROUP BY sender_id;
Tôi đã đọc qua tài liệu về tập hợp trong các truy vấn ORM, và mặc dù chú thích() có thể xử lý cột COUNT đầu tiên, nhưng tôi không thấy cách nào để có được kết quả COUNT (DISTINCT) (thậm chí thêm (select = {}) đã không hoạt động, mặc dù có vẻ như nó cần). Điều này có thể được dịch sang một truy vấn ORM Django hay tôi chỉ nên gắn bó với SQL thô?
Các [ ' .distinct() '] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct) bộ lọc có thể com e tiện dụng. –
Nếu chúng ta bỏ qua COUNT (DISTINCT recipient_id), nó khá đơn giản khi sử dụng chức năng chú thích và đếm. Ở đây, Django của riêng biệt() không giúp đỡ. Tôi không nghĩ rằng có thể tích hợp hai thứ này (chú thích và phân biệt) với nhau. Bạn phải viết hai truy vấn tôi đoán. – jurgenreza