加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django设计模式以覆盖模型

发布时间:2020-12-20 13:26:28 所属栏目:Python 来源:网络整理
导读:我正在为Django开发一个电子商务框架.主要设计目标是在模型和视图方面提供最低限度的功能,而不是允许库的用户使用自己的组件扩展或替换组件. 这样做的原因是,尝试为电子商务开发一种通用的解决方案会导致代码过于复杂,而这通常远非最佳. 解决这个问题的一种
我正在为Django开发一个电子商务框架.主要设计目标是在模型和视图方面提供最低限度的功能,而不是允许库的用户使用自己的组件扩展或替换组件.

这样做的原因是,尝试为电子商务开发一种通用的解决方案会导致代码过于复杂,而这通常远非最佳.

解决这个问题的一种方法似乎是通过Django的设置文件或导入黑客来使用控制反转,但是由于Django如何注册其模型,我遇到了一些问题.

电子商务框架提供了一堆抽象模型,以及{app_label} /models.py中的具体版本.视图利用Django的get_model(app_label,model)函数返回模型类,而无需对引用进行硬编码.

这种方法有一些问题:

>用户必须模仿框架应用程序的结构,即app_label,并有效地用自己的应用程序替换我们的应用程序版本
>由于管理站点的工作方式是在每个已安装的应用程序中查找admin.py,因此他们必须模仿或显式导入框架的管理类才能使用它们.但是通过导入它们,会调用register方法,因此如果用户想要自定义它们,则必须取消注册.
>用户必须非常小心他们如何从核心框架导入具体模型.这是因为一旦读取了类定义(即__new__),Django的基本模型元类会自动将应用程序缓存注册到模型中,并且使用特定标签注册的第一个模型就是您坚持使用的模型.因此,在导入任何核心模型之前,必须定义所有覆盖模型.这意味着您最终会遇到混乱的情况,即在模块的底部而不是顶部进行大量导入.

我的想法是进一步降低控制反转的兔子洞:

>所有对核心组件(模型,视图,管理员等)的引用都替换为对IoC容器的调用
>对于所有核心(电子商务框架)模型,将Django的基本模型元类的使用替换为不自动注册模型的模型,然后让容器在启动时显式注册它们.

我的问题:

有没有更好的方法来解决这个问题?目标是使自定义框架和覆盖功能变得容易,而不必学习很多烦人的技巧.关键似乎是模型和管理站点.

我很欣赏使用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
它扩展了cart-logic,因此它通过urlpattern挂钩:

(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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读