首先,讓我說,有一個地方沒有Django的機器說的意思公開方便你想要什麼。
(編輯 - 事實上,因爲Django的1.7有:https://docs.djangoproject.com/en/1.7/howto/custom-lookups/)
也就是說,如果你真的想做到這一點,子類QuerySet
並重寫_filter_or_exclude()
方法。然後創建一個自定義管理器,只返回您的自定義QuerySet
(或者Django的Django的QuerySet
,yuck)。我們在neo4django中這樣做,在構建Neo4j專用Query
對象時重用盡可能多的Django ORM查詢集代碼。
嘗試一些(大致)像這樣,改編自Zach的答案。我已經離開實際的錯誤處理領域查找分析作爲一個練習留給讀者:)
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來提高性能,但是認爲更清楚地說明一下。玩的開心!
這些答案對他的例子很有用(可能或可能不是他剛纔拋出來表達他的觀點)。但是如果有人會回答實際上被問到的問題,我會喜歡它。 – royal 2010-12-07 03:39:22
@royal我想我的答案涵蓋了它 - 我已經在我正在研究的圖書館中出現了。 – 2011-11-26 22:40:52