2015-10-26 133 views
-1

我正在关注一个关于使用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)它的工作原理和过滤器只是活动的帖子,但我没有一个自定义管理器可以做到这一点。不,了解这里发生了什么。

回答

3

内置方法是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) 
+0

工作,这是从早期版本的Django改变了吗?它曾经是get_query_set。我正在按照一个较老的教程。 – Pythonista

+0

我认为这在'Django 1.6'中被改变了。 –