如何从特定的Django Model实例中获取所有RelatedManagers?

时间:2011-10-28 16:27:03

标签: python django django-models

假设我有一组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。在我的情况下,我不知道实际的DB scema。我想获得当前模型实例的所有RelatedManager属性。

我认为可以通过._meta属性实现此功能,但我在尝试时无法做到这一点。所以我可能需要一个类似get_related_managers(self)方法实现的实际工作示例。

1 个答案:

答案 0 :(得分: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()