我已經爲模型添加了「取消」字段,有沒有辦法將模型默認查詢修改爲像cancel = False這樣的東西?而不必修改我所有的過濾/排除查詢?在django中修改默認查詢集
回答
您可以使用自定義模型管理器執行此操作,並覆蓋get_queryset
函數始終過濾cancel = False。
class CustomManager(models.Manager):
def get_queryset(self):
return super(CustomManager, self).get_queryset().filter(canceled=False)
class MyModel(models.Model):
# Blah blah
objects = CustomManager()
然後,當調用MyModel.objects.all()
時,它將始終排除取消的對象。這裏是一篇博文,我發現這個主題很有幫助。 http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/
編輯: 或許有一個自定義的經理更好的方法是將其附加到另一個屬性,不是對象等,如:
class MyModel(models.Model):
# Blah blah
active = CustomManager()
而在你的意見你的查詢看起來像MyModel.active.all()
。
EDIT2: 對於現代版本的django,更新了從get_query_set
到get_queryset
的拼寫方法。
你可以寫自定義query manager,但我不認爲這是正確的路要走。這會爲過濾器提供隱含的隱藏條件,從而導致代碼無法讀取。請記住Python的禪宗:Explicit is better than implicit
。檢測地點,您需要添加取消= False,只需添加此,這是您應該這樣做的方式。
我強烈反對。那麼,什麼是定製管理者?關於'not_cancelled = CustomManager()'然後使用MyModel.not_cancelled.all()隱含了什麼? – jonwd7 2010-03-23 04:28:38
- 1. 修改默認Sprint積壓查詢
- 2. 覆蓋默認查詢集
- 3. Django的模型表單集 - 修改表單標籤,默認
- 4. 修改查詢集結果
- 5. Enterprise Architect:修改默認檢查註釋
- 6. 創建Django的表單字段默認爲空查詢集
- 7. 在SQL Server中修改默認值
- 8. 擴展IQueryable以修改默認查詢行爲
- 9. 由於LINQ查詢而被修改的默認對象
- 10. 修改默認數量
- 11. BuddyPress的:修改BP-默認
- 12. 修改默認elasticsearch模板
- 13. 修改默認模擬器
- 14. 修改默認-Prefix.pch文件
- 15. 默認情況下修改默認命令:默認命令爲
- 16. Django的,爲的ModelForm修改查詢集時傳遞信息
- 17. 查詢改變列的默認值
- 18. 更改默認功能django
- 19. django查詢集
- 20. SQL查詢默認
- 21. 修改Python中的默認字體Tkinter
- 22. 修改默認的網站在IIS 6.0
- 23. 多個表和修改的查詢集
- 24. 更改默認字符集
- 25. 在LINQ查詢中的默認值
- 26. 更改Django中的默認表名
- 27. 更改Django TimeInput中的默認時間
- 28. 更改查詢集上的Django分頁
- 29. Django中的空查詢集
- 30. ORDER_BY查詢集與在Django
你必須非常非常小心,重寫默認管理器就是這樣。在這種特殊情況下,一旦項目被取消,您將無法通過filter()/ get()找到它。 – 2010-03-22 18:08:49
同意。我通常會補充這種方法,如果給定pk,則重寫get()不使用此過濾器。您可能還想更改管理查詢集以返回所有包括取消。但是,如果你很少想在你的查詢中取消項目,這可能是一個合理的方法。 – 2010-03-22 18:25:55
嗨,有沒有辦法修改get_query_set的行爲來使用其他參數,即從某處傳遞,或使用全局變量,如當前登錄用戶信息?謝謝! – ultrajohn 2012-06-10 21:39:04