2011-07-25 47 views
1

我需要結合模型的兩個實例,我需要經歷的過程非常簡單。系統中沒有太多規範化的數據。要結合這兩者,我只需要合併數據,並在相關的任何模型上設置相關的foreign_keys。如何用django的orm找到與特定模型關係的所有模型?

問題在於儘量保持應用程序儘可能「可重用」。我不想編輯這個模塊,只要添加其他可能適用於此模型的模型。有沒有一種方法可以獲得具有外鍵的模型列表到另一個特定模型?以及相關領域是什麼?

此外,回到這個根模型的一些鏈接將通過通用外鍵。 Hoever我假設找到鏈接到根對象的模型可以找到鏈接到ContentTypes模型的模型。

+0

我有一個照片模型類似的問題,並需要知道每一個這樣的特定照片使用(權利管理問題)。我發現的唯一方法是通過每個對象鏈發出單獨的查詢。我很想知道是否還有更好的方法,因爲它確實感覺不對,並且非常違反DRY。 –

回答

1

您可能可以通過自省來解決這個問題,但是您會將模型與Django實現緊密耦合,這可能很危險。如果你善於與,你可以做線沿線的東西:

class MyModel(models.Model): 
    ## Definitions 
    @property 
    def related(self): 
     related = [] 
     for attr in dir(self): 
      try: 
       ## Get the class name. 
       attr_type = type(bf.__getattribute__(attr)).__name__ 
       ## This is an internal type tucked away in: 
       ##  django/db/models/fields/related.py 
       ## As best I can tell, this is only used for reverse 
       ## relationships. 
       if attr_type == "RelatedManager": 
        related.extend(bf.__getattribute__(attr).all()) 
      except: 
       ## Some of the built in methods/properties throw errors, 
       ## skip them. 
       pass 
     return related 

可能不是最好的解決辦法,但它似乎在測試工作。

+0

它至少比直接引用每個關係更好,但你說得對,因爲它使用了Django內部的潛在移動目標。儘管如此,仍然沒有解決收集數據的100次數據庫的主要問題,但是可能不會有這種情況。 –

+0

沒有什麼幫助,因爲大多數關係都是通用的,我想不得不跟蹤和手動更新可能需要更新的模型列表: -/ – Hutch

+0

您可以在'settings.py'中放置這樣一個列表,這將保持您的應用程序可重用。 –