2

我有幾個使用ForeignKeys關係相互連接的模型。
這種層次結構中的主要部分包含所有者字段。Django中的多個模型的單個自定義管理器

我想創建一個單定製經理所有這些模型改變取決於被稱之爲模型返回的查詢集。

我知道經理可以訪問self.model來獲取它所連接的模型。

Class Main(models.Model) 
    owner=models.ForeignKey (User) 
    owned = OwnedManager() 

Class Second(models.Model) 
    main=models.ForeignKey('Main') 
    owned = OwnedManager() 

Class Third(models.Model) 
    second=models.ForeignKey('Second') 
    owned = OwnedManager() 

我想我的自定義經理有這種行爲:

class OwnedManager(models.Manager): 
    def get_owned_objs(self, owner): 
     if self.model == 'Main': # WRONG: How do I get the model name? 
      owned_main = self.filter(owner=owner) 
      return owned_main 
     elif self.model == 'Second': 
      owned_second = self.filter(main__owner=owner) 
      return owned_second 
     else: 
      owned_third = self.filter(second__main__owner=owner) 
      return owned_third 

爲了有一個統一的方式來調用它在不同的車型,像這樣:

main_object.owned.get_owned_objs(owner=user1) # of the Model Main 
second_object.owned.get_owned_objs(owner=user1) # of the Model Second 
third_object.owned.get_owned_objs(owner=user1) # of the Model Third 

問題:

  • self.model == 'Main'是錯誤的。我沒有這樣的模型名稱。有沒有辦法得到它?
  • 這是高效的嗎?你知道一個更好的方法來實現這個嗎?也許自定義管理器繼承?

編輯 - 我的解決方案: 下面的接受的答案是一個很好的解決方案,但我也找到了一種方法來獲得特定模型調用自定義經理的型號名稱,那就是:

if self.model.__name__ == 'Main': 

這裏的關鍵是屬性__name__

回答

0

1)使抽象的模型

class AbstractModel(models.Model): 
    class Meta(models.Meta): 
     abstract = True 

    objects = OwnedManager() 

2)繼承AbstractModel你的模型,放在元

class Model(AbstractModel) 
    class Meta(AbstractModel.Meta): 
     filter_key = 'some_key' 

3的一些關鍵)重新設計你的OwnedManager

class OwnedManager(models.Manager): 
    def get_owned_objs(self, owner): 
     if hasattr(self.model._meta, 'filter_key'): 
      return self.filter(**{self.model._meta.filter_key: owner}) 

現在你可以使用任何繼承模型SomeModel.objects.get_owned_objs(owner=user1),其中filter_key是不設置好的獲取模型的名稱。

+0

謝謝,它看起來是一個很好的解決方案,我會嘗試它。我還找到了一種從自定義管理器獲取模型名稱的方法。我已經更新了我的問題,包括我的解決方案。 – Leonardo

相關問題