0

我正在使用一个名为django-countries的 django 包,它可以让我访问世界上的一些国家属性,例如国名、国家代码、国旗等。

似乎默认似乎是国家代码,我想知道如何能够使用国家名称而不是默认的国家代码。

模型.py

from django.db import models
from django_countries.fields import CountryField

class Product(models.Model):
    name = models.CharField(max_length=36)
    price = models.PositiveIntegerField()
    country = CountryField(blank_label='(select country)')

例如在我看来,我有这样的代码

def analyse_market(request):
    qs = Product.objects.values('country').annotate(
        number=Count('pk')
    ).order_by('country')

    result = {
        q['country']: q['number']
        for q in qs
    }

    print(result)

    context = {"result":result}
    return render(request, 'core/analyse-market.html', context)

这将返回如下结果:

{'AD': 3, 'AR': 5, 'BH': 1, 'FR': 1, 'JP': 1, 'NG': 1, 'NL': 1}

在文档中,他们使用了不同的方法,例如 country.name、country.code、country.flag,我尝试了 country.name,因为它与我的需要有关,但是在我的中使用 country.name 时出现 KeyError意见。

4

1 回答 1

2

CountryFieldfrom django-countries 只是一个带有选择的CharField选项。当values在一个字段上使用时,只需获取存储在数据库中的实际值。你需要把它变成你想要的。

要在视图中执行此操作:

from django_countries import countries

COUNTRY_DICT = dict(countries)

def analyse_market(request):
    qs = Product.objects.values('country').annotate(
        number=Count('pk')
    ).order_by('country')

    result = {
        COUNTRY_DICT[q['country']]: q['number']
        for q in qs
    }

    print(result)

    context = {"result":result}
    return render(request, 'core/analyse-market.html', context)

要在模板中执行此操作:

{% load countries %}

{% for country_code, number in result.items %}
    {% get_country country_code as country %}
    Country Name: {{ country.name }}
    Number: {{ number }}
{% endfor %}

编辑:如果要直接Country从视图中传递对象,可以执行以下操作:

from django_countries.fields import Country

result = {
    Country(code=q['country']): q['number']
    for q in qs
}

注意:也许元组列表对此会更好?IE

result = [ (Country(code=q['country']), q['number']) for q in qs]
于 2021-03-10T05:14:31.757 回答