我一直试图在一个简单的模型上过滤一个查询集但到目前为止没有运气。
这是我的模特:
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()
我想做的事情如下:
Country.objects.filter(get_code_display__icontains="france")
Country.objects.filter(code__display__icontains="france")
Country.objects.filter(get_code_display__icontains="france")
但上述情况均无效。如何过滤具有choices
属性的字段?我认为被覆盖的__unicode__
会有所帮助,但我想我错过了一些东西。
答案 0 :(得分:22)
你不能这样做。 filter
在数据库级别工作,数据库对您的长名称一无所知。如果要对值进行过滤,则需要将该值存储在数据库中。
另一种方法是将值转换回代码,并对其进行过滤:
country_reverse = dict((v, k) for k, v in COUNTRY_CHOICES)
Country.objects.filter(code=country_reverse['france'])
答案 1 :(得分:1)
您可以在构造函数中交换值:
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']
答案 2 :(得分:0)
受到this answer的启发,我做了以下事情:
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)
答案 3 :(得分:0)
您可以使用Choices
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)
并提出疑问:
Country.objects.filter(code=Country.COUNTRY_CHOICES.france)