如何获取特定Django模型实例的所有RelatedManagers?
假设我有一组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_objects
和 self._meta.many_to_many
来实现同样的功能。