我正在尝试从相关模型的管理器访问管理器方法,但没有成功。
让我们说这些是我的模特:
class ModelA(models.Model):
description = models.TextField(blank=True)
objects = ModelAQuerySet.as_manager()
class ModelB (models.Model):
a = models.ForeignKey(ModelA, related_name='a_objs')
objects = ModelBQuerySet.as_manager()
我将管理器定义为QuerySet,即:
class ModelAQuerySet(models.QuerySet):
def description_starts_with(self, desc):
return self.filter(description__startswith=desc)
class ModelBQuerySet(models.QuerySet):
pass
我要做的是创建一个ModelBQuerySet方法,该方法从某个描述开始预取modelA对象。
这是我尝试做的一个错误示例:
class ModelBQuerySet(models.QuerySet):
def prefetch_a_objs_starts_with(self, desc):
return self.prefetch_related(
Prefetch('a_objs',
queryset=ModelAQuerySet.description_starts_with(desc),
to_attr='a_objs_with_desc'))
这当然是行不通的,因为description_starts_with
是实例方法,这里我从类中调用它。
即使这是完全错误的,我希望它能引起我正在尝试做的事情的想法。
问题是:如何使用可访问其相关的models.QuerySet
实例方法的预取来创建models.QuerySet
方法?