Django:你如何从经理内部访问模型的实例?

时间:2010-01-25 21:56:53

标签: django django-models django-managers

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 个答案:

答案 0 :(得分:6)

当您使用经理时要求实例是没有意义的。管理员是类级属性 - 如果你尝试foo.objects.all() foo是Supercalifragilisticexpialidocious的一个实例,你将明确地得到一个错误:

AttributeError: Manager isn't accessible via Supercalifragilisticexpialidocious instances

答案 1 :(得分:3)

据我所知,您无法从经理内部访问该模型。当管理者在整个桌面上运作时,它没有意义。

你应该在模型中做这样的事情:

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)

答案 2 :(得分:1)

在类似object.related_name.create()的方法中,Django会发送一个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。