0

フィールドがクエリされた場合、フィルターが常に __iexact になるようなカスタム フィールドを作成したいと考えています。

例:

class Domain(models.Model):
    domain = models.IExactCharField()
    name = models.CharField()

Domain.objects.filter('domain=newdomain')のようなクエリを のように書き換えたいDomain.objects.filter('domain__iexact=newdomain')

カスタム マネージャーでこれを実行できることは理解していますが、フィールドを追加してカスタム マネージャーを追加したいと考えています。また、カスタム マネージャーが既に定義されている場合は、マネージャーの機能を連鎖させたいと考えています。これは可能ですか?メソッドを見ていてcontribute_to_class、フィールドを定義するときに何らかの可能性があるのではないかと考えました。

4

1 に答える 1

0

以下のコードは機能しません。残念ながら、lookup_type は別の場所 (QuerySet 内) に追加されています。中を見ていきます:)

class IExactCharField(models.CharField):
    def get_prep_lookup(self, lookup_type, value):
        return super(IExactCharField, self).get_prep_lookup('iexact', value)

スーパークラスを参照する前に、最終的にチェックを追加できますlookup_type

PS。一部のデータベース (SQLite) は、大文字と小文字を区別しない Unicode 文字列検索をサポートしないことに注意してください。

編集:私が持っている唯一の回避策は、save()またはいくつかの保存信号ですべてのドメインフィールドを小文字にすることです。

于 2012-06-07T17:07:06.410 に答える