如何使用Django自定义模型管理器

时间:2012-02-03 00:30:45

标签: django django-models django-managers

如何确定某些内容应该是单独的自定义模型管理器还是现有模型管理器的功能?

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

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

例如:

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

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

1 个答案:

答案 0 :(得分: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。

相关问题