Django什么是Manager内的“对象”

时间:2013-06-26 13:12:41

标签: django object django-managers

通常我会通过SomeModel.objects()访问查询集。

我注意到在模型中,objects被定义为某个管理器,如objects=SomeManager()

因此,如果我在Manager中定义方法,我将如何访问objects

如......

class SomeManager(models.Manager):
    def some_method(self):
        ( HOW WOULD I ACCESS OBJECTS HERE? )

class SomeModel(models.Model):
    ... blah blah
    objects=SomeManager()

如果我想过滤一些东西,我想我可以在经理里面做SomeModel.objects.filter但不知何故感觉很奇怪。它会是self.filter还是什么?

2 个答案:

答案 0 :(得分:1)

是的,您只需使用self.filter,其中'self'指的是Manager本身。模型的默认管理器为objects,如果您未指定自定义管理器,则会自动创建该管理器。因为您在做自定义管理器,所以不要使用objects,因为显然会使用默认管理器,而不是自定义管理器。{1}}

因此,从Docs中,一个例子是:

class BookManager(models.Manager):
    def title_count(self, keyword):
        return self.filter(title__icontains=keyword).count()

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    num_pages = models.IntegerField(blank=True, null=True)
    objects = BookManager()

答案 1 :(得分:1)

简短回答:您不会从内部访问经理。没有必要,因为您可以通过self

访问所有方法 在这种情况下,

objects是经理。由于您通常使用管理员来访问filterget之类的内容,因此您可以使用self.filterself.get在课堂上本地访问这些内容。

如果您需要将select_related应用于管理员返回的每个查询集,则可以覆盖get_queryset方法。