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