Джанго: Как вы получаете доступ к экземпляру модели из менеджера? - PullRequest
2 голосов
/ 26 января 2010
class SupercalifragilisticexpialidociousManager(models.Manager):
    # Sorry, I'm sick of Foo and Spam for now.
    def get_query_set(self, account=None):
        return super(SupercalifragilisticexpialidociousManager,
                     self).get_query_set().filter(uncle=model_thats_using_this_manager_instance.uncle)

Волшебство, которое я ищу, это "дядя = model_thats_using_this_manager_instance.uncle". Похоже, я должен быть в состоянии сделать это как-то. Я знаю, что могу сказать self.model, чтобы получить модель, но как получить экземпляр?

Ответы [ 3 ]

6 голосов
/ 26 января 2010

Нет смысла просить экземпляр, когда вы используете менеджера. Менеджеры являются атрибутами уровня класса - если вы попытаетесь выполнить foo.objects.all(), где foo - это экземпляр Supercalifragilisticexpialidocious, вы получите явную ошибку:

AttributeError: Manager isn't accessible via Supercalifragilisticexpialidocious instances
3 голосов
/ 26 января 2010

Насколько я знаю, вы не можете получить доступ к модели изнутри менеджера. Это не имеет смысла, поскольку менеджеры оперируют всем столом.

Вы должны сделать что-то подобное в модели:

class Model(models.Model):
    # some attributes here
    def getAllRelativesWithSameUncle(self):
        return Model.objects.filter(uncle = self.uncle)

или в менеджере:

class SupercalifragilisticexpialidociousManager(models.Manager):
    def getSelfRelativesFor(self, model):
        return self.get_queryset().filter(uncle=model)
1 голос
/ 07 ноября 2018

В таких методах, как object.related_name.create() под капотом, Djangos передает аргумент hint:

class UserQuerySet(QuerySet):
    def create(self, *args, **kwargs):
        print(self._hints)
        # >>> {'instance': <User: random-user>}
        print(self._hints.get('instance'))
        # >>> <User: random-user>

В настоящее время я использую Django 1.11.

...