Django: Filter for get_foo_display in a Queryset
You can't do this. filter
works at the database level, and the database doesn't know anything about your long names. If you want to do filtering on a value, you need to store that value in the database.
An alternative is to translate the value back into the code, and filter on that:
country_reverse = dict((v, k) for k, v in COUNTRY_CHOICES)Country.objects.filter(code=country_reverse['france'])
You can use Choices
from model_utils import Choicesclass Country(models.Model): COUNTRY_CHOICES = Choices(( ('FR', _(u'France')), ('VE', _(u'Venezuela')), )) code = models.CharField(max_length=2, choices=COUNTRY_CHOICES)
And make a query:
Country.objects.filter(code=Country.COUNTRY_CHOICES.france)
You can swap values in constructor:
class PostFilter(django_filters.FilterSet): def __init__(self, data=None, queryset=None, prefix=None, strict=None): data = dict(data) if data.get('type'): data['type'] = Post.get_type_id(data['type'][0]) super(PostFilter, self).__init__(data, queryset, prefix, strict) class Meta: model = Post fields = ['type']