派生 class 的 Django 自定义模型管理器 - 根据基本 class 属性过滤
Django custom model manager for derived class - filtering on base class attribute
我正在使用 Django 3.2
我有以下型号:
class AuthoriseableApprovedManager(models.Manager):
def get_queryset(self):
return super(AuthoriseablePendingManager, self).get_queryset().filter(computed_status=AUTHORISATION_STATUS_APPROVED)
class Authorisable(models.Model):
# various fields ...
approved_objects = AuthoriseableApprovedManager()
class ApprovedPublishedArticlesManager(models.Manager):
def get_queryset(self):
return self.approved_objects.filter(is_published=True)
class Article(Authorisable,
# Other base classes
):
# various fields
# ....
objects = models.Manager() # The default manager.
approved_published_articles = ApprovedPublishedArticlesManager()
class Meta:
ordering = ('-created_at', )
我的 views.py
中有以下代码
class ArticleListView(ListView):
model = Article
def get_queryset(self):
return self.model.approved_published_articles.all() # <- Barfs here ...
我收到错误消息:
'ApprovedPublishedArticlesManager' object has no attribute 'approved_objects'
这是有道理的,因为 ApprovedPublishedArticlesManager
不是从 Authorisable
派生的。
我如何创建允许我根据基础 class 属性进行过滤的自定义管理器 - 我的自定义管理器是否必须派生自 models.Manager
和相关基础 class( Authorisable
在这种情况下)?
问题出在您 ApprovedPubhishedArtcilesManager
的 .get_queryset(…)
方法上。您可以通过以下方式访问模型:
class ApprovedPublishedArticlesManager(models.Manager):
def get_queryset(self):
return <strong>self.model</strong>.approved_objects.filter(is_published=True)
尽管从 AuthoriseableApprovedManager
继承并利用 .get_queryset(…)
方法的基本实现可能会更好。这也更稳健,因为您不必考虑该经理将注册的名称。
我正在使用 Django 3.2
我有以下型号:
class AuthoriseableApprovedManager(models.Manager):
def get_queryset(self):
return super(AuthoriseablePendingManager, self).get_queryset().filter(computed_status=AUTHORISATION_STATUS_APPROVED)
class Authorisable(models.Model):
# various fields ...
approved_objects = AuthoriseableApprovedManager()
class ApprovedPublishedArticlesManager(models.Manager):
def get_queryset(self):
return self.approved_objects.filter(is_published=True)
class Article(Authorisable,
# Other base classes
):
# various fields
# ....
objects = models.Manager() # The default manager.
approved_published_articles = ApprovedPublishedArticlesManager()
class Meta:
ordering = ('-created_at', )
我的 views.py
中有以下代码class ArticleListView(ListView):
model = Article
def get_queryset(self):
return self.model.approved_published_articles.all() # <- Barfs here ...
我收到错误消息:
'ApprovedPublishedArticlesManager' object has no attribute 'approved_objects'
这是有道理的,因为 ApprovedPublishedArticlesManager
不是从 Authorisable
派生的。
我如何创建允许我根据基础 class 属性进行过滤的自定义管理器 - 我的自定义管理器是否必须派生自 models.Manager
和相关基础 class( Authorisable
在这种情况下)?
问题出在您 ApprovedPubhishedArtcilesManager
的 .get_queryset(…)
方法上。您可以通过以下方式访问模型:
class ApprovedPublishedArticlesManager(models.Manager):
def get_queryset(self):
return <strong>self.model</strong>.approved_objects.filter(is_published=True)
尽管从 AuthoriseableApprovedManager
继承并利用 .get_queryset(…)
方法的基本实现可能会更好。这也更稳健,因为您不必考虑该经理将注册的名称。