Django自定义管理器报错:Manager isn't accessible via Post instances 问题求助
问题原因分析
你遇到的这个报错'Manager isn't accessible via Post instances',根源在于模型字段和自定义管理器的名字重复了!
看你的Post模型代码:
# 先定义了一个DateTime类型的字段叫published published = models.DateTimeField(default=timezone.now) # 后面又把自定义管理器命名为published published = PublishedManager()
Django中,模型的管理器是类级别的属性,而字段也是类属性。当你用同一个名字published同时定义字段和管理器时,会触发命名冲突:Django处理模型或查询操作时,会混淆published到底是实例字段还是类管理器,哪怕你没直接通过实例调用管理器,ListView在底层执行查询逻辑时也会因为这个混淆抛出错误。
解决方法
只需要把自定义管理器的名字改成和字段不重复的即可,比如改成published_posts:
修改models.py里的Post模型:
class Post(models.Model): # ... 其他字段保持不变 ... published = models.DateTimeField(default=timezone.now) # 重命名自定义管理器,避免和字段名冲突 published_posts = PublishedManager() objects = models.Manager()
之后如果你要查询已发布的文章,就用Post.published_posts.all();如果想让PostListView默认使用这个自定义管理器,可以在视图里指定查询集:
class PostListView(ListView): model = Post template_name = 'blog/index.html' context_object_name='posts' queryset = Post.published_posts.all() # 指定使用自定义管理器的查询集
这样命名冲突就解决了,报错自然会消失。
内容的提问来源于stack exchange,提问作者Rupesh Chaulagain
相关产品推荐
相关产品推荐

