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 |
Florent · 如何在Django中聚合多个字段? 1 年前 |
KWunsch · Django没有将pk引入模板 1 年前 |
Akshay mek · Vscode扩展建议不适用于某些文件夹 1 年前 |
Farid · 限制django每个客户的访问 2 年前 |
Blue · 从Django中的输入字段获取用户输入 2 年前 |
4SadMemeXD · 无法在Django中选择相关类别 2 年前 |