En primer lugar, permítanme decir que no existe un mecanismo de Django en el lugar que está destinado a facilitar públicamente lo desea.
(Editar - en realidad desde Django 1.7 existe: https://docs.djangoproject.com/en/1.7/howto/custom-lookups/)
Dicho esto, si realmente quiere lograr esto, subclase QuerySet
y reemplazar el método _filter_or_exclude()
. A continuación, cree un administrador personalizado que solo devuelva su QuerySet
personalizado (o mono-parche Django QuerySet
, yuck). Hacemos esto en neo4django para reutilizar la mayor cantidad de código de interrogación ORM de Django posible mientras construimos objetos específicos de Neo4j Query
.
Pruebe algo (más o menos) como este, adaptado de la respuesta de Zach. He dejado para el manejo del análisis de campo de búsqueda de error real como ejercicio para el lector :)
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()
Observaciones finales - con claridad, si quieres las búsquedas de campos personalizados cadena, esto va a ser bastante peludo. Además, normalmente escribo esto un poco más funcionalmente y uso itertools para el rendimiento, pero pensé que era más claro dejarlo fuera. ¡Que te diviertas!
Estas respuestas son útiles para su ejemplo (que puede o no haber sido algo que simplemente arrojó para exponer su punto) ... pero me encantaría que alguien respondiera la pregunta que realmente se hizo. – royal
@royal Creo que mi respuesta lo cubre: he tenido esto en una biblioteca en la que estoy trabajando. –