通常我会通过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
还是什么?
答案 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
是经理。由于您通常使用管理员来访问filter
和get
之类的内容,因此您可以使用self.filter
或self.get
在课堂上本地访问这些内容。
如果您需要将select_related
应用于管理员返回的每个查询集,则可以覆盖get_queryset
方法。