gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:58:20 25 4
gpt4 key购买 nike

假设我有一组 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。就我而言,我不知道实际的数据库场景。我想获取当前模型实例的所有 RelatedManager 属性。

我认为可以通过 ._meta 属性来实现这一点,但我在尝试时没有设法做到这一点。所以我可能需要一个像 get_related_managers(self) 方法实现这样的实际工作示例。

最佳答案

这似乎对我有用:

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()

UPD:在较新的 django 版本中,_meta 没有这样的方法,但同样可以用 self._meta.related_objects 来完成和 self._meta.many_to_many

关于python - 如何从特定的 Django 模型实例中获取所有 RelatedManagers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7932053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com