Django设计模式以覆盖模型
我正在为Django开发一个电子商务框架.主要设计目标是在模型和视图方面提供最低限度的功能,而不是允许库的用户使用自己的组件扩展或替换组件.
这样做的原因是,尝试为电子商务开发一种通用的解决方案会导致代码过于复杂,而这通常远非最佳. 解决这个问题的一种方法似乎是通过Django的设置文件或导入黑客来使用控制反转,但是由于Django如何注册其模型,我遇到了一些问题. 电子商务框架提供了一堆抽象模型,以及{app_label} /models.py中的具体版本.视图利用Django的get_model(app_label,model)函数返回模型类,而无需对引用进行硬编码. 这种方法有一些问题: >用户必须模仿框架应用程序的结构,即app_label,并有效地用自己的应用程序替换我们的应用程序版本 我的想法是进一步降低控制反转的兔子洞: >所有对核心组件(模型,视图,管理员等)的引用都替换为对IoC容器的调用 我的问题: 有没有更好的方法来解决这个问题?目标是使自定义框架和覆盖功能变得容易,而不必学习很多烦人的技巧.关键似乎是模型和管理站点. 我很欣赏使用IoC容器不是Django世界中常见的模式,所以我想尽可能避免它,但它看起来像是正确的解决方案. 解决方法
您是否使用类似方法查看其他项目的代码?
不确定这种方式是否满足您的需求,但是值得看一下 django-shop的代码. 该框架提供了基本逻辑,允许您在需要时提供自定义逻辑. 通过模型定制 例如,参见productmodel.py #============================================================================== # Extensibility #============================================================================== PRODUCT_MODEL = getattr(settings,'SHOP_PRODUCT_MODEL','shop.models.defaults.product.Product') Product = load_class(PRODUCT_MODEL,'SHOP_PRODUCT_MODEL') 通过逻辑/网址进行自定义 例如,参见商店的simplevariation-plugin (r'^shop/cart/',include(simplevariations_urls)),(r'^shop/',include(shop_urls)), 并扩展了观点: from shop.views.cart import CartDetails class SimplevariationCartDetails(CartDetails): """Cart view that answers GET and POSTS request.""" ... 该框架为钩子提供了几个点,上面提到的simplevariation-plugin还提供了一个cart-modifier: SHOP_CART_MODIFIERS = [ ... 'shop_simplevariations.cart_modifier.ProductOptionsModifier',... ] 我担心这种解释不是很容易理解,很难简要总结这个概念.但是看看django-shop项目及其一些扩展:ecosystem (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |