2012-02-03 102 views
1

如何确定某件事是否应该是单独的自定义模型管理器或现有模型管理器的功能?如何使用Django自定义模型管理器

例如,我可以创建一个模型管理器,其中queryset是模型的所有实例。然后我可以在该管理器中创建函数来返回子集,例如 - 只列出为私有或公共列表的实例。

或者 - 我可以为每个返回私有实例和公共实例的查询集的每个人创建一个单独的自定义模型管理器。

如:

Video.objects.get_private() 
Video.objects.get_public() 

Video.private.all() 
Video.public.all() 

回答

1

通过Python的禅:

>>> import this 
The Zen of Python, by Tim Peters 

...  
Explicit is better than implicit. 
... 
>>> 

可能是你的情况比较复杂,比我用你的代码样本推断,但恕我直言,你应该只使用一个过滤器:

Video.objects.filter(private=False) 

如果你想腾出常用的过滤器类型的中风,记得查询集是懒惰的,所以你可以保存它们:

private_videos = Video.objects.filter(private=False) 
... 
private_videos.objects.filter(director='Frederico Felini').order_by('-year') 

的第一项任务将不会触发与数据库的通信。为更复杂的东西备用自定义管理器。

我看过很多模型方法和/或自定义管理器的模式,因为Django模板系统sux^H^H ^他故意残障(不能在不创建模板过滤器的情况下调用带参数的方法)。如果是这种情况,请将模板图层切换到Jinja2。

相关问题