tôi có các mô hình:Django đếm trên nhiều-nhiều
class Article(models.Model):
title = models.TextField(blank=True)
keywords = models.ManyToManyField(Keyword, null=True, blank=True)
class Keyword(models.Model):
keyword = models.CharField(max_length=355, blank=True)
Tôi muốn có được một đếm bao nhiêu bài viết mỗi từ khóa. Về bản chất tôi muốn có một danh sách các từ khóa mà tôi có thể nhận được mỗi từ khóa để tính trọng số tương đối.
Tôi đã thử:
keyword_list=Article.objects.all().annotate(key_count=Count('keywords__keyword'))
nhưng
keyword_list[0].key_count
chỉ dường như để cho tôi số lượng từ khóa khác nhau mỗi bài viết có? Có bằng cách nào đó một tra cứu ngược lại không?
Mọi trợ giúp sẽ được đánh giá cao.
CẬP NHẬT
Vì vậy, tôi đã nhận nó làm việc:
def keyword_list(request):
MAX_WEIGHT = 5
keywords = Keyword.objects.order_by('keyword')
for keyword in keywords:
keyword.count = Article.objects.filter(keywords=keyword).count()
min_count = max_count = keywords[0].count
for keyword in keywords:
if keyword.count < min_count:
min_count = keyword.count
if max_count > keyword.count:
max_count = keyword.count
range = float(max_count - min_count)
if range == 0.0:
range = 1.0
for keyword in keywords:
keyword.weight = (
MAX_WEIGHT * (keyword.count - min_count)/range
)
return { 'keywords': keywords }
nhưng kết quả xem trong một số gớm ghiếc của các truy vấn. Tôi đã thử thực hiện các đề xuất đưa ra ở đây (cảm ơn) nhưng đây là chỉ có methid mà dường như làm việc tại thời điểm này. Tuy nhiên, tôi phải làm điều gì đó sai vì bây giờ tôi có hơn 400 truy vấn!
CẬP NHẬT
Wooh! Cuối cùng đã nhận nó làm việc:
def keyword_list(request):
MAX_WEIGHT = 5
keywords_with_article_counts = Keyword.objects.all().annotate(count=Count('keyword_set'))
# get keywords and count limit to top 20 by count
keywords = keywords_with_article_counts.values('keyword', 'count').order_by('-count')[:20]
min_count = max_count = keywords[0]['count']
for keyword in keywords:
if keyword['count'] < min_count:
min_count = keyword['count']
if max_count < keyword['count']:
max_count = keyword['count']
range = float(max_count - min_count)
if range == 0.0:
range = 1.0
for keyword in keywords:
keyword['weight'] = int(
MAX_WEIGHT * (keyword['count'] - min_count)/range
)
return { 'keywords': keywords}
Tại sao điều này xuống bình chọn nó có vẻ như câu trả lời đúng, hoặc tôi thiếu một cái gì đó? – solartic
Đây thực sự là câu trả lời đúng, nhưng có lẽ có thể sử dụng một chút giải thích. – jathanism
Bạn có thể đơn giản hóa nó thành 'Keyword.objects.all(). Chú thích (Đếm ('bài viết')) [0] .article__count' – guival