假设我有一组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)
方法实现的实际工作示例。
答案 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()
。