【问题标题】:Django custom model manager for derived class - filtering on base class attribute派生类的 Django 自定义模型管理器 - 过滤基类属性
【发布时间】:2021-12-28 14:02:27
【问题描述】:

我正在使用 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”对象没有属性“approved_objects”

这是有道理的,因为ApprovedPublishedArticlesManager 不是从Authorisable 派生的。

如何创建允许我根据基类属性进行过滤的自定义管理器 - 我的自定义管理器是否必须从 models.Manager 和相关基类(在本例中为 Authorisable)派生?

【问题讨论】:

    标签: django django-models django-managers


    【解决方案1】:

    问题在于您的ApprovedPubhishedArtcilesManager.get_queryset(…) 方法。您可以通过以下方式访问模型:

    class ApprovedPublishedArticlesManager(models.Manager):
        def get_queryset(self):
            return self.model.approved_objects.filter(is_published=True)

    虽然从AuthoriseableApprovedManager 继承并利用.get_queryset(…) 方法的基本实现可能会更好。这也更加健壮,因为您不必考虑该经理将注册的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 2014-06-27
      • 2012-06-02
      • 2013-05-01
      相关资源
      最近更新 更多