Django: Filter for get_foo_display in a Queryset Django: Filter for get_foo_display in a Queryset django django

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']