2017-08-17 49 views
1

我有Django的定義如這些某些型號:函數可以引用被調用的類嗎?

class Post(models.Model): 
    text = models.CharField(max_length=50) 

class Thread(models.Model): 
    title = models.CharField(max_length=50) 

,我想有一個,叫裏面要麼這些類的外部函數,做了有關在它被調用的類。

例如,ListAll()函數,調用它裏面Post(),列出了所有Post對象,而是叫裏面Thread,列出了所有Thread對象。

我該怎麼做?我見過使用__this__的回覆,但顯然引用了特定的類實例,這讓我有點困惑。

謝謝。

回答

1

這是一個mixin的工作,可以添加到任何類。

class ListAll: 
    def list_all(self): 
     return self.__class__.objects.all() 

它添加到類:

class Post(ListAll, models.Model): 
    ... 

並使用它:

my_post_obj.list_all() 

我希望這是一個例子,雖然,因爲這將是更好的選擇只是傳遞模型將自己分類到任何想要列出對象的地方。

1

您可以使用函數模型內部以及那些可以用類調用對象

class Thread(models.Model): 
    title = models.CharField(max_length=50) 

    def listAll(self): 
     return self.objects.all() # a function that would return all objects 

按照意見,如果你有使用的許多型號單一功能的要求,那麼你可以通過動態加載模型的名稱。我不會說它的推薦或任何東西,但它完美的作品。

import importlib 
model_module = importlib.import_module('app_name.models.models') 
# remember this example refers to loading a module not its class so if you 
# have a file models.py containing all the models then this should be perfect 
model_object = model_module.model_name # now you have loaded the model 
data = model_object.objects.all() # apply whatever you want now 
+0

但是這並不意味着在每個模型上都有完全相同的功能嗎?這就是我想要避免的重複。 – Man

+0

如果是這樣,那麼你必須編寫一個採用模型名稱的函數,將其導入並應用過濾器或查詢。這將包括動態加載模型 –

+0

那麼這就是問題的關鍵,我不知道該怎麼做。我感謝您的幫助。 – Man

相關問題