2010-03-03 56 views
5

我已經更改了GenericForeignKey()可以引用的某些對象的默認管理器,以便這些對象可能不再出現在該默認管理器中。通過GenericForeignKey()使用非默認管理器

我有其他的管理者能夠找到這些刪除對象,但我看不出有關它們的內容類型框架。這可能嗎?

我實現「軟刪除」一些車型涉及以下管理:

from django.db import models 

SDManager(models.Manager): 

    def get_query_set(self): 
     return super(SDManager, self).get_query_set().filter(is_deleted=False) 

SDDeletedManager(models.Manager): 

    def get_query_set(self): 
     return super(SDDeletedManager, self).get_query_set().filter(is_deleted=True) 

這使我能夠做到以下幾點:

SDModel(models.Model): 
    # ... 
    objects = SDManager() # Only non (soft) deleted objects 
    all_objects = models.Manager() # The default manager 
    deleted_objects = SDDeletedManager() # Only (soft) deleted objects 

當在模型中使用GenericForeignKey()場爲了引用定義的對象,例如SDModel,它使用_default_manager屬性,該屬性評估爲objects管理器,以獲得參考。這意味着當對象被軟刪除時它會丟失引用。

這是我使用GenericForeignKey()字段的主要原因之一。我一直在研究的解決方案是實現較低版本的內容類型框架,以便我可以定義我自己的get_object(),它使用all_objects管理器來訪問引用對象。

所以我的問題真的是:

是否有可能使用與現有的內容類型框架非默認的經理,以便先找到軟刪除的對象,否則我將不得不重新實現所有我從零開始需要的零件?

+0

您可能需要了解更多細節併發布示例代碼。 – stefanw 2010-03-04 01:07:27

+0

我已經添加了更多細節,讓您更清楚地瞭解我的困境。 – 2010-03-04 02:20:48

+0

很抱歉,如果我遺漏了一些顯而易見的東西,但是你有沒有考慮將「對象」作爲默認models.Manager並命名SDManager?即交換對象和all_objects的定義? – 2010-03-04 05:37:01

回答

2

我和你有完全相同的問題,在深入瞭解文檔/源代碼後,它看起來像Django並沒有提供開箱即用的方法。我找到的最簡單的方法是將子類GenericForeignKey,然後重寫__get__方法。

The troublesome line是它稱之爲:

rel_obj = ct.get_object_for_this_type(pk=getattr(instance, self.fk_field)) 

所以這條線需要被改寫爲:

rel_obj = ct.model_class().all_objects.get(pk=getattr(instance, self.fk_field)) 

這是一個有點hackish的,但它的作品,然後你使用全像通常那樣,GenericForeignKey的強大功能。