派生 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(…) 方法的基本实现可能会更好。这也更稳健,因为您不必考虑该经理将注册的名称。