【问题标题】:custom model manager not working properly自定义模型管理器无法正常工作
【发布时间】:2016-01-25 01:30:23
【问题描述】:

我正在关注有关使用 cutom 模型管理器的 django 教程,但无法弄清楚为什么这不起作用。

我正在尝试使用自定义模型管理器来过滤仅在数据库中标记为活动的帖子,因此它不会显示尚未完成的帖子。

模型管理器

class PostManager(models.Manager):

    def get_query_set(self):

         return super(PostManager, self).get_query_set().filter(is_active=True)

型号

class Post(models.Model):

    title = models.CharField(max_length = 100)
    description = models.TextField(max_length = 500)
    body = models.TextField(blank = True)
    created = models.DateTimeField(auto_now_add = True)
    modified = models.DateTimeField(auto_now_add = True)
    is_active = models.BooleanField(default = 1)
    allow_comments = models.BooleanField(default = 1)
    category= models.ForeignKey(Category)
    creator = models.ForeignKey(User)
    slug = models.SlugField(unique = True)

    active = PostManager() #Gets just the active posts
    objects = models.Manager()

然后我尝试使用 posts= Post.active.all() 过滤活动帖子 现在,如果我将其更改为 posts = Post.active.filter(is_active=True) 它可以工作并仅过滤活动帖子,但我可以在没有自定义管理器的情况下这样做。不,了解这里发生了什么。

【问题讨论】:

    标签: python django python-3.x django-models django-admin


    【解决方案1】:

    内置方法是get_queryset() 而不是get_query_set(),因此您应该覆盖get_queryset() 并调用父类的get_queryset() 方法。

    class PostManager(models.Manager):
    
        def get_queryset(self):
            return super(PostManager, self).get_queryset().filter(is_active=True)
    

    【讨论】:

    • 成功了,这是从早期版本的 Django 中改变的吗?它曾经是 get_query_set。我正在学习一个较旧的教程。
    • 我认为这在 Django 1.6 中已更改。
    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多