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

发布于 2025-01-02 14:13:55 字数 338 浏览 1 评论 0原文

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

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

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

例如:

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

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

How do you determine whether something should be a separate custom model manager or a function of an existing model manager?

For example I could create a single model manager whose queryset is all instances of the model. Then I could create functions within that manager to return subsets like - only instances listed as private, or public.

Alternately - I could create a separate custom model manager for each of those returning the queryset of private instances and public instances.

eg:

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

or

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

薯片软お妹 2025-01-09 14:13:55

来自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^His 故意造成障碍(如果不创建模板过滤器,则无法使用参数调用方法)。如果是这种情况,请将模板层切换为Jinja2。

From the zen of Python:

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

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

May be your situation is more complicated than I inferred by your code sample, but IMHO you should just use a filter:

Video.objects.filter(private=False)

If you are trying to spare type strokes for common filters, remember querysets are lazy, so you can store them:

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

The first assignment will not trigger communication with the database. Spare custom managers for more complex stuff.

I've seen this pattern of lots of model methods and/or custom managers because Django template system sux^H^H^His intentionally handicapped (you can't call methods with arguments without creating template filters). If it is the case, switch the template layer to Jinja2.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文