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

我正在寻找的魔法是“uncle=model_thats_using_this_manager_instance.uncle”。看来我应该能够以某种方式做到这一点。我知道我可以说self.model获取模型,但是如何获取实例?

4

3 回答 3

7

当您使用管理器时,请求实例是没有意义的。管理器是类级别的属性——如果你尝试foo.objects.all()去 where foois an instance of Supercalifragilisticexpialidocious,你会明确地得到一个错误:

AttributeError: Manager isn't accessible via Supercalifragilisticexpialidocious instances
于 2010-01-25T22:39:27.653 回答
4

据我所知,您无法从管理器内部访问模型。这没有任何意义,因为经理们在整张桌子上进行操作。

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

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)
于 2010-01-25T22:43:26.420 回答
3

在像底层这样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。

于 2018-11-06T22:38:41.990 回答