まず、あなたが望むことを公に促進することを意図した Django の仕組みが整っていないことを言わせてください。
(編集 - 実際には Django 1.7 以降があります: https://docs.djangoproject.com/en/1.7/howto/custom-lookups/ )
つまり、本当にこれを達成したい場合は、メソッドをサブクラス化QuerySet
してオーバーライドします_filter_or_exclude()
。次に、カスタムのみを返すカスタムマネージャーを作成しますQuerySet
(またはDjangoのモンキーパッチQuerySet
、yuck)。これをneo4djangoで行うのは、Neo4j 固有のQuery
オブジェクトを構築する際に Django ORM クエリセット コードをできるだけ多く再利用するためです。
ザックの答えから適応した、このような(大まかに)何かを試してください。読者の演習として、フィールド ルックアップ解析の実際のエラー処理を残しました :)
class PersonQuerySet(models.query.QuerySet):
def _filter_or_exclude(self, negate, *args, **kwargs):
cust_lookups = filter(lambda s: s[0].endswith('__within5'), kwargs.items())
for lookup in cust_lookups:
kwargs.pop(lookup[0])
lookup_prefix = lookup[0].rsplit('__',1)[0]
kwargs.update({lookup_prefix + '__gte':lookup[1]-5,
lookup_prefix + '__lt':lookup[1]+5})
return super(PersonQuerySet, self)._filter_or_exclude(negate, *args, **kwargs)
class PersonManager(models.Manager):
def get_query_set(self):
return PersonQuerySet(self.model)
class Person(models.Model):
age = #...
objects = PersonManager()
最後のコメント - 明らかに、カスタム フィールドのルックアップを連鎖させたい場合、これはかなり複雑になります。また、私は通常、これをもう少し機能的に記述し、パフォーマンスのために itertools を使用しますが、省略した方が明確であると考えました。楽しむ!