带有附加数据的 Django 注释

问题描述

我有一个课程模型和课程类别,这是一个选择字段。理想情况下,我希望有一个查询来计算每个类别的课程数量并显示课程的实际名称。

CATEGORY = (
    ('itd','IT Development'),('wd','Web Design'),('iandd','Illustration and Drawing'),('sm','Social Media'),('ps','PhotoShop'),('crypto','CryptoCurrencies'),)   
category = models.CharField(max_length=100,choices=CATEGORY)

我当前的注释查询

context['course_by_category'] = Course.objects.values('category').annotate(count=Count('category'))

返回以下正确但我也想要类别的名称,而不是缩写

[{'category': 'crypto','count': 6},{'category': 'iandd','count': 5},{'category': 'itd','count': 2},{'category': 'ps',{'category': 'sm','count': 3},{'category': 'wd','count': 5}]

我最终在 HTML 中使用了它,如下所示:

    {% for course in course_by_category %}
        <div class="col-lg-4 col-md-6">
            <div class="categorie-item">
                <div class="ci-thumb set-bg" data-setbg="{% static 'img/categories/1.jpg' %}"></div>
                <div class="ci-text">
                    
                     <h5>{{THIS_IS_WHERE_I_WANT_COURSE_NAME}}</h5>

                    <p>Lorem ipsum dolor sit amet,consectetur</p>
                    <span>{{course.count}} Courses</span>
                </div>
            </div>
        </div>
    {% endfor %}

从我在这里读到的内容来看,我的请求似乎与我处理它的方式不太可能: Selecting additional values after annotate in Django

从我在这里读到的内容来看,这不是我想要的,但至少我可以获得类别的名称(不知道如何将它们组合到现有的注释调用中): Django queryset annotation,charfield with choices and trying to get the display value

for query in context['course_by_category']:
     print(context['course_by_category'].model(category=query['category']).get_category_name())
        
CryptoCurrencies
Illustration and Drawing
IT Development
PhotoShop
Social Media
Web Design

如果有其他帖子,请告诉我。我经历了一些,但他们没有得到我想要的。提前感谢您的帮助。

更新: 我找到了一个丑陋的解决方案,让我达到了我想要的

new_list = []
for query in context['course_by_category']:
    name = context['course_by_category'].model(category=query['category']).get_category_name()
    query['name'] = name
    new_list.append(query)
context['new_list'] = new_list

我希望有更好的方法:/

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)