views:

101

answers:

1

In my model I have a field:

   country = models.CharField(_('Country'), max_length=2, choices=COUNTRIES)

Where COUNTRIES is a tuple of tuples like this:

COUNTRIES = (
    ('AF', _('Afghanistan')),

... and so on

Now I want to filter an instance of that model, by the country name.

This:

   i = MyModel.objects.filter(country__iexact=query)

only lets me filter by the country code.

How can I filter by country name?

+4  A: 

You cannot filter directly by the country name (the choices are only used in the UI, not in the database).

If you get the full name as an input, lookup the code in the COUNTRIES tuple-of-tuples. For example:

# ... initialize a lookup dictionary
country_to_id_dict = dict((t[1], t[0]) for t in COUNTRIES)

# ... use the dictionary in the query
i = MyModel.objects.filter(country__exact=country_to_id_dict[query])
codeape
Hmm, I tried this, but I get a Exception Type: KeyError with the country_to_id_dict looking somehow like this:{<django.utils.functional.__proxy__ object at 0x1d0f7d0>: 'AF', <django.utils.functional.__proxy__ object at 0x1d0f8d0>: 'AL', ... and so on.Maybe its because the second element in each tuple is a translatable text, because:from django.utils.translation import ugettext_lazy as _
miernik
OK, a minor modification of country_to_dict worked:country_to_id_dict = dict((t[1][:], t[0]) for t in COUNTRIES)Thanks.Even better to maek this case insensitive (the query is folded to lowercase elsewhere):country_to_id_dict = dict((t[1][:].lower(), t[0]) for t in COUNTRIES)
miernik