Po pierwsze, chciałbym powiedzieć, że nie ma maszyny Django w miejscu, które jest przeznaczone do ułatwienia publicznie, co chcesz.
(Edit - faktycznie od Django 1.7 znajduje się: https://docs.djangoproject.com/en/1.7/howto/custom-lookups/)
Powiedział, że jeśli naprawdę chcą tego dokonać, podklasa QuerySet
i zastąpić metodę _filter_or_exclude()
. Następnie utwórz niestandardowego menedżera, który zwraca tylko niestandardową QuerySet
(lub łatkę z łatą małpy Django, QuerySet
, fuj). Robimy to w neo4django, aby ponownie wykorzystać jak najwięcej kodu zapytania Django ORM podczas budowania obiektów specyficznych dla Neo4j Query
.
Spróbuj czegoś (w przybliżeniu) w ten sposób, zaadaptowanego z odpowiedzi Zacha. Zostawiłam rzeczywisty błąd obsługi dla parsowania przeglądowej pole jako ćwiczenie dla czytelnika :)
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()
Uwagi końcowe - oczywiście, jeśli chcesz łańcuch niestandardowych wyszukiwań polowych, to będzie uzyskać bardzo owłosione. Poza tym normalnie pisałbym to nieco bardziej funkcjonalnie i używał itertools do wydajności, ale myślałem, że lepiej jest go pominąć. Baw się dobrze!
Te odpowiedzi są użyteczne dla jego przykładu (który może, ale nie musi, był czymś, co po prostu wyrzucił, by wyrazić swoją opinię). Ale chciałbym, żeby ktoś odpowiedział na pytanie, które faktycznie zostało zadane. – royal
@royal Wydaje mi się, że moja odpowiedź obejmuje to - wymyśliłem to w bibliotece, nad którą pracuję. –