1

假设我有一个包含相关(外键)字段的模型。同样,这些外键字段可能引用可能包含或可能不包含相关字段的模型。请注意,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)
}

比方说,我有一个 model 实例Model1 model1,我想获取与它直接相关的对象,即所有 Model2 和 Model3 对象,以及间接相关的对象,即与之前检索到的 Model2 对象相关的所有 Model3 对象。我还想考虑在OTHER MODEL上定义相关字段的一对一字段的情况。

另外,请注意,我可能不知道我当前正在处理的实例的模型。假设在前面的例子中,我现在可能不是模型model1的一个实例Model1。所以我想动态地执行所有这些。

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

  1. 如何获取对象的所有相关字段?
  2. 我应该如何使用它们来获取实际的相关对象?

或者有没有办法更好地做到这一点?非常感谢!

更新:

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

4

1 回答 1

1

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

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

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

[model1._meta.local_fields 中字段的 field.name if field.rel]

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

于 2013-10-09T09:35:46.950 回答