django模型实例与数据库有关系,而当我将一个对象从ModelName.objects.get()传递给上层时。我不想暴露它可以访问数据库的操作,例如:save(),delete()。因此,我目前定义了另一个类(比如Product),其中的属性几乎与Model类(比如ProductModel)中的属性相同。 每次我需要实例时,我都会从另一个中复制属性。应该有更好的练习,不是吗?
from django.db import models
class ProductModel(models.Model):
price = models.FloatField(default=0.0)
class Product(object):
def __init__(self):
self.id = 1
self.price = 12.3
答案 0 :(得分:0)
您正在描述DTO(数据传输对象)模式,可能是为了防止客户端代码直接调用模型上的CRUD方法。
我认为这种模式在django中是不同寻常的。首先,通过不将模型直接传递给您的视图和模板上下文,您将失去强大的功能,例如通过QuerySets延迟加载关系和查询的能力。
如果你想在你的crud操作上执行某些业务逻辑,那么还有许多类似django的解决方案。信号是一个:https://docs.djangoproject.com/en/1.9/ref/signals/您可以使用它们来创建保存前和保存后挂钩。客户端代码可能仍然没有意识到他们的操作。
一旦开始在模型中使用大量业务逻辑,建议引入服务对象。客户端代码应在需要时通过服务对象进行交互。除了惯例,协议,代码审查以及可能的分析工具之外,没有什么难以确保这一点。
话虽如此,没有什么能阻止你编写一个简单的映射器,它将django模型转换为服务层中的普通旧python对象。您只需要遍历模型上的数据库字段并在python对象或字典上设置属性,然后在更新操作上反转该过程。这让我觉得太多的仪式(我可能选择了一种不像django那样围绕ActiveRecord模式的技术)。