0

通常我会通过SomeModel.objects().

我注意到在模型内部,objects被定义为某个 Manager,例如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东西吗?

4

2 回答 2

1

是的,您只需使用self.filter,其中 'self' 指的是 Manager 本身。该模型的默认管理器是objects,如果您不指定自定义管理器,它会自动创建。因为您是一个自定义管理器,所以您不使用objects,因为显然这将使用默认管理器,而不是您的自定义管理器。

因此,从文档中,一个例子是:

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()
于 2013-06-26T13:35:25.370 回答
1

简短的回答:您不能从内部访问管理器。没有必要,因为您可以通过以下方式访问所有方法self

objects在这种情况下是经理。由于您通常使用管理器来访问诸如此类的内容filter,因此您可以使用或get在课堂上本地访问它们。self.filterself.get

如果您需要对select_related管理器返回的每个查询集应用类似的东西,您可以覆盖该get_queryset方法。

于 2013-06-26T13:36:19.147 回答