2012-07-05 75 views
0

我們的應用程序將用戶模型中的is_active字段設置爲False以表示已刪除的用戶。
從每次訪問用戶表中排除已刪除用戶(where is_active=False)的最佳做法是什麼?
請考慮以下事項:
1.該應用程序已經編寫完畢,因此我們希望儘可能最少更改代碼。
2.該應用程序使用:request.user,get_object_or_404(),當然還有User.objects,所以解決方案必須考慮所有這些。Django auth_user - 排除非活動用戶的最佳做法

從我所做的研究中,我發現:
1.代理模式:將迫使我在代碼中進行很多更改;我不知道它如何與requestget_object_or_404()一起工作。
2. contribute_to_class:它可以用來覆蓋objects經理或只是添加一個新的?它安全嗎?
3.中間件更改:我不想進入此。對我來說太冒險了。

有沒有一個優雅的方式來做到這一點?

+0

我想你可以爲你的用戶模型定義一個自定義的默認管理器。看看django文檔。 – Jingo 2012-07-05 13:11:54

+0

嗨。我確實查看了文檔。他們沒有說如何覆蓋用戶模型的默認管理器,僅針對其他用戶(您需要在模型類中指定自定義管理器,而在用戶模型中則沒有) – user1102018 2012-07-05 13:29:38

回答

1

沒有辦法做到這一點,也不應該嘗試。將每個操作限制爲一系列模型實例的唯一方法是限制默認查詢集,然後該查詢集有效地孤立了排除的實例,從而無法再次訪問它們。 Django docs明確警告這種行爲。

如果您覆蓋get_query_set()方法並篩選出任何行,則Django將返回不正確的結果。不要這樣做。 過濾結果爲get_query_set()的經理不適合用作自動管理員。 (強調我的)

「自動」管理器基本上與默認管理器相同。這是用於相關領域,在Django管理員以及Django機器的無數其他領域。如果您限制默認管理器,則會限制所有板塊的所有內容。

現在,還有其他選項可以快速訪問有限的查詢集;他們根本不是「自動的」,這意味着你必須重點使用它們,而不是讓所有的事情都通過魔法來發生。然而,「魔術」在這方面違反了核心Python租戶之一:顯式優於隱式。默認情況下限制User查詢集是隱式操作。手動過濾查詢集,引用自定義管理器方法或使用User的子類都是明確的操作,因此更可取。

+0

感謝您的詳細回答。我想你寫的東西是有道理的,儘管它沒有以我想要的方式解決我的問題。 – user1102018 2012-07-06 09:12:28