![]() |
1
21
请参见DjangosNippets上的以下片段: http://djangosnippets.org/snippets/734/ 您不必将自定义方法放在管理器中,而是对查询集本身进行子类化。这很容易,而且工作得很好。我唯一遇到的问题是模型继承,您总是必须在模型子类中定义管理器(在子类中只是:“objects=queryset manager()”),即使它们将继承queryset。一旦您使用了querysetmanager,这将更加合理。 |
![]() |
2
8
下面是使用由Simon定制的QuerySetManager解决我的问题的具体解决方案,它是Scott链接到的。
任何将来想要向查询集添加额外功能的mixin只需要扩展basemixin(或者将其放在其继承关系中的某个位置)。每当我试图过滤查询集时,我都会用一个try-catch来包装它,以防该字段实际上不存在(即,它不会扩展该mixin)。全局筛选器是使用globals()调用的,而删除筛选器是自动调用的(如果删除了某些内容,我永远不希望显示)。使用此系统可以使用以下类型的命令:
需要注意的一点是,删除过滤器不会影响管理接口,因为默认管理器是首先声明的(使其成为默认管理器)。我不记得他们什么时候把管理员改为使用model.\u默认的管理器而不是model.objects,但是任何删除的实例仍然会出现在管理员中(如果你需要取消删除它们)。 |
![]() |
3
2
我花了一段时间想办法建一个好工厂来做这个,但是我遇到了很多问题。 我能给你的最好建议是把你的遗产链起来。它不是很通用,所以我不确定它有多有用,但是你要做的就是:
如果你想要更通用的东西,我能想到的最好办法就是定义一个基
它看起来像这样(根本不经过测试):
好吧,这很难看,但它给你带来了什么?本质上,它是相同的解决方案,但更具动态性,更干燥,但阅读起来更复杂。 首先,动态创建经理:
这将创建一个新的管理器,它是
接下来,创建mixin模型:
就像我说的,很难看。但这意味着你不必重新定义
那么,这真的很实用吗?也许不是。这个答案更像是(ab)中使用Python灵活性的练习。虽然我确实使用了一些动态扩展类的底层主体,以使访问更容易,但我没有尝试使用它。 如果有任何不清楚的地方请告诉我,我会更新答案。 |
![]() |
4
2
另一个值得考虑的选择是PassthroughManager: https://django-model-utils.readthedocs.org/en/latest/managers.html#passthroughmanager |
![]() |
KWunsch · Django没有将pk引入模板 2 年前 |
![]() |
4SadMemeXD · 无法在Django中选择相关类别 2 年前 |
![]() |
Programming Hints · 如何检查日期是否过期? 3 年前 |
![]() |
LuizGTVSilva · 从Django表单恢复数据 3 年前 |
![]() |
Mike Vlad · Django泛型类视图模型更改 7 年前 |