2015-10-26 64 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'中被改變了。 –