获取Django中对象的所有相关对象?

时间:2013-01-23 08:36:13

标签: django django-models

我们假设我有一个包含相关(外键)字段的模型。同样,那些外键字段可以指代可能包含或不包含相关字段的模型。请注意,Django中的关系字段可以是一对一,多对一或多对多。

现在,给定一个模型的实例,我希望以直接或间接的方式递归并动态地获取与其相关的模型的所有实例。从概念上讲,我想执行相关对象的遍历并返回它们。

示例:

class Model1{
   rfield1 = models.ForeignKey("Model2")
   rfield2 = models.ManyToManyField("Model3")
   normalfield1 = models.Charfield(max_length=50)
}
class Model2{
   sfield = models.ForeignKey("Model3")
   normalfield = models.CharField(max_length=50)
}
class Model3{
   normalfield = models.CharField(max_length=50)
}

假设我有一个模型Model1 model1的实例,我希望获得与它直接相关的对象,即所有Model2和Model3对象,以及间接相关的对象,即与Model2相关的所有Model3对象之前检索的对象。我还想考虑一对一字段的情况,其中相关字段在 OTHER MODEL 上定义。

另外,请注意,我可能不知道我正在处理的实例的模型。让我们说在前面的例子中,我现在可能不会model1Model1模型的实例。所以我想动态地执行所有这些。

为此,我想我需要一种方法来获取对象的所有相关字段。

  1. 如何获取对象的所有相关字段?
  2. 我应该如何使用它们来获取实际的相关对象?
  3. 或者有没有办法更好地做到这一点?非常感谢你!

    更新:

    我已经知道如何执行1,而2基本上直接来自1. :)稍后更新。

1 个答案:

答案 0 :(得分:1)

如果你有model1获取所有它的很多很多字段名称(等)很容易,因为这是众所周知的,这些都存储在meta的'local_many_to_many'列表中:

  

[model1._meta.local_many_to_many中字段的field.name]

外键有点棘手,因为它们与meta的'local_fields'列表中的所有其他字段一起存储。因此,我们需要确保它具有各种关系。这可以按如下方式完成:

  

[field1.name for model1._meta.local_fields in field.rel]

此方法不需要您的模型知识。如果名称不够,还可以对字段对象进行进一步的询问。