如何获取特定Django模型实例的所有RelatedManagers?

1 投票
1 回答
2412 浏览
提问于 2025-04-17 05:12

假设我有一组Django模型:

class Article(models.Model):
    title = models.CharField(max_length=100, default='')
    content = models.TextField(default='', blank=False)
    created_at = models.DateTimeField(auto_now=True)
    creator = models.ForeignKey(User, null=True, blank=True)
    score = models.ForeignKey('Score', blank=True, null=True)
    points = models.ManyToManyField('Points')


class Score(models.Model):
    value = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    creator = models.ForeignKey(User, null=True, blank=True)


class Points(models.Model):
    value = models.DecimalField(max_digits=3, decimal_places=1)
    caption = models.CharField(max_length=20, default='')
    created_at = models.DateTimeField(auto_now_add=True)
    creator = models.ForeignKey(User, blank=True, null=True)

现在我得到一个Score模型的实例(但我并不知道这是Score模型),还有一个Points模型的实例(同样,我也不知道这是Points模型):

>>> type(s)
<class 'myapp.models.Score'>
>>> type(p)
<class 'myapp.models.Points'>

现在我可以通过以下代码访问一组相关的Article实例:

>>> s.article_set
<django.db.models.fields.related.RelatedManager object at 0x10d1e8610>
>>> p.article_set
<django.db.models.fields.related.ManyRelatedManager object at 0x10d1e8850>

但在这个情况下,我是知道数据库的结构,并且知道这些属性叫做article_set。而在我的情况下,我并不知道实际的数据库结构。我想获取当前模型实例的所有相关管理器属性。

我觉得可以通过._meta属性来实现这个,但我在尝试的时候没有成功。所以我可能需要一个像get_related_managers(self)方法实现的实际工作示例。

1 个回答

4

这对我来说似乎有效:

def get_related_managers(self):
    managers = []
    for related_object in self._meta.get_all_related_objects():
        managers.append(getattr(self, related_object.get_accessor_name()))
    return managers

如果你想要处理多对多的关系,你还需要遍历一下 self._meta.get_all_related_many_to_many_objects()

更新:在较新的 Django 版本中,_meta 不再有这样的函数,但你可以用 self._meta.related_objectsself._meta.many_to_many 来实现同样的功能。

撰写回答