Как я могу получить все RelatedManager из конкретного экземпляра Django Model? - PullRequest
1 голос
/ 28 октября 2011

Допустим, у меня есть набор моделей 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) реализации метода.

1 Ответ

4 голосов
/ 28 октября 2011

Мне кажется, это работает:

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(), если вы хотите, чтобы многие также обращались к ним.

...