2011-07-25 112 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'中放置这样一个列表,这将保持您的应用程序可重用。 –