Tôi đang xây dựng một trang web Django để thảo luận. Người dùng có thể tham gia thảo luận và cũng có thể bỏ phiếu tán thành cho các cuộc thảo luận và thông điệp trong các cuộc thảo luận. Mô hình dữ liệu được đơn giản hóa như sau:Django: đặt hàng một queryset bằng tổng các trường được chú thích?
class Discussion:
name = models.CharField(max_length=255)
class Message:
owner = models.ForeignKey(User, related_name='messages')
body = models.TextField()
discussion = models.ForeignKey(Discussion, related_name='messages')
class MessageApprovalVote:
owner = models.ForeignKey(User, related_name='message_approval_votes')
message = models.ForeignKey(Message, related_name='approval_votes')
class DiscussionApprovalVote:
owner = models.ForeignKey(User, related_name='discussion_approval_votes')
discussion = models.ForeignKey(Discussion, related_name='approval_votes')
Tôi muốn chọn 20 cuộc thảo luận "hoạt động tích cực nhất", có nghĩa là sắp xếp theo tổng số lượng tin nhắn, tổng số phiếu bầu phê duyệt tin nhắn và số lượng chính thảo luận bỏ phiếu cho cuộc thảo luận đó, hoặc (trong giả):
# Doesn't work
Discussion.objects.
order_by(Count('messages') +
Count('approval_votes') +
Count('messages__approval_votes'))
Sử dụng chú thích, tôi có thể tính toán tổng số của mỗi yếu tố ba điểm:
scores = Discussion.objects.annotate(
total_messages=Count('messages', distinct=True),
total_discussion_approval_votes=Count('approval_votes', distinct=True),
total_message_approval_votes=Count('messages__approval_votes', distinct=True))
tôi sau đó t hought Tôi đã vào một cái gì đó khi tôi tìm thấy extra
phương pháp:
total_scores = scores.extra(
select={
'score_total': 'total_messages + total_discussion_approval_votes + total_message_approval_votes'
}
)
và sau đó sẽ có thể làm:
final_answer = total_scores.order_by('-score_total')[:20]
nhưng cuộc gọi extra
đưa ra một DatabaseError
:
DatabaseError: column "total_messages" does not exist
LINE 1: SELECT (total_votes + total_messages + total_persuasions) AS...
và do đó tôi đã thất bại. Phương thức extra
có không tham chiếu các trường annotate
d? Có một cách khác để làm những gì tôi đang cố gắng để làm, ngắn của việc sử dụng một truy vấn sql nguyên? Tôi đang sử dụng Postgres nếu điều đó tạo nên sự khác biệt.
Mọi thông tin chi tiết sẽ được đánh giá cao!
https : //docs.djangoproject.com/en/dev/topics/db/aggregation/#aggregating-annotations Điều này không đủ hữu ích? – karthikr
Tổng hợp không có vẻ như nó sẽ giúp ích trong trường hợp này bởi vì tôi cần lấy lại một truy vấn của các đối tượng Thảo luận, không chỉ là số đếm của từng yếu tố chấm điểm. – davidscolgan