15

単純なモデルでクエリセットをフィルタリングしようとしましたが、今のところうまくいきません。

これが私のモデルです:

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__が役立つと思いましたが、何かが足りないと思います。

4

4 に答える 4

28

これはできません。filterデータベース レベルで動作し、データベースは長い名前について何も知りません。値に対してフィルタリングを行う場合は、その値をデータベースに保存する必要があります。

別の方法は、値をコードに変換し、それをフィルタリングすることです。

country_reverse = dict((v, k) for k, v in COUNTRY_CHOICES)
Country.objects.filter(code=country_reverse['france'])
于 2011-01-18T18:03:10.143 に答える
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']
于 2015-05-27T16:45:32.680 に答える
0

この回答に触発されて、私は次のことを行いました:

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)
于 2017-11-20T19:35:10.447 に答える