In primo luogo, lasciatemi dire che non v'è alcun macchinario Django in luogo che è destinata a facilitare pubblicamente ciò che vuoi.
(Edit - in realtà dal Django 1.7 c'è: https://docs.djangoproject.com/en/1.7/howto/custom-lookups/)
Detto questo, se si davvero vuole per raggiungere questo obiettivo, sottoclasse QuerySet
e l'override del metodo _filter_or_exclude()
. Quindi crea un gestore personalizzato che restituisce solo la tua QuerySet
personalizzata (o la patch di scimmia di Django QuerySet
, bleah). Lo facciamo in neo4django per riutilizzare il più possibile il codice queryset di Django ORM mentre si costruiscono oggetti specifici di Neo4j.
Provate qualcosa (approssimativamente) come questo, adattato dalla risposta di Zach. Ho lasciato effettivo trattamento per il parsing campo di ricerca errore come un esercizio per il lettore :)
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()
Considerazioni finali - in modo chiaro, se si vuole le ricerche sul campo catena di misura, questo sta per diventare piuttosto peloso. Inoltre, normalmente lo scriverei un po 'più funzionalmente e userei itertools per le prestazioni, ma ho pensato che fosse più chiaro lasciarlo fuori. Divertiti!
fonte
2011-11-26 22:38:50
Queste risposte sono utili per il suo esempio (che può o non può essere stato qualcosa che ha appena sballottato per esprimere il suo punto) .. ma mi piacerebbe che qualcuno rispondesse alla domanda che è stata effettivamente posta. – royal
@royal Penso che la mia risposta lo copra- Ho avuto questo in una biblioteca su cui sto lavorando. –