Django: filtro para get_foo_display en un Queryset

He estado tratando de filtrar un queryset en un modelo simple pero hasta ahora sin suerte.

Aquí está mi modelo:

class Country(models.Model): COUNTRY_CHOICES = ( ('FR', _(u'France')), ('VE', _(u'Venezuela')), ) code = models.CharField(max_length=2, choices=COUNTRY_CHOICES) def __unicode__(self): return self.get_code_display() 

Y me gustaría hacer algo como:

 Country.objects.filter(get_code_display__icontains="france") Country.objects.filter(code__display__icontains="france") Country.objects.filter(get_code_display__icontains="france") 

Pero ninguno de los anteriores está funcionando. ¿Cómo filtrar en un campo que tiene un atributo de choices ? Pensé que el __unicode__ anulado ayudaría, pero creo que me estoy perdiendo algo.

No puedes hacer esto. filter funciona a nivel de la base de datos, y la base de datos no sabe nada acerca de sus nombres largos. Si desea realizar el filtrado de un valor, debe almacenar ese valor en la base de datos.

Una alternativa es traducir el valor nuevamente en el código, y filtrar en eso:

 country_reverse = dict((v, k) for k, v in COUNTRY_CHOICES) Country.objects.filter(code=country_reverse['france']) 

Puedes intercambiar valores en el 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'] 

Puedes usar las opciones

 from model_utils import Choices class Country(models.Model): COUNTRY_CHOICES = Choices(( ('FR', _(u'France')), ('VE', _(u'Venezuela')), )) code = models.CharField(max_length=2, choices=COUNTRY_CHOICES) 

Y hacer una consulta:

 Country.objects.filter(code=Country.COUNTRY_CHOICES.france) 

Inspirado en esta respuesta , hice lo siguiente:

 search_for = 'abc' results = ( [ x for x, y in enumerate(COUNTRY_CHOICES, start=1) if search_for.lower() in y[1].lower() ] ) Country.objects.filter(code__in=results)