我有两个相似的类,一个是业务对象,第二个是Django模型。这就是代码:
class Vehicle():
def __init__(self, make, model, year, miles, sold_on, sale_price, purchase_price):
self.make = make
self.model = model
self.year = year
self.miles = miles
self.sold_on = sold_on
self.sale_price = sale_price
self.purchase_price = purchase_price
def __str__(self):
return 'Vehicle: %s %s %s %s' % (self.make, self.model, self.year, self.miles)
def calculate_sale_price(self):
if self.miles > 0 and self.miles <= 20000:
return 15500
elif self.miles > 20000 and self.miles <= 50000:
return 11200
elif self.miles > 50000 and self.miles <= 100000:
return 8550
elif self.miles > 100000 and self.miles <= 200000:
return 4645
else:
return 2300
def is_vehicle_luxury(self):
if self.make in ['Cadilac', 'Lexus', 'BMW']:
return True
if self.year in [2000, 2015, 1945, 1973]:
return True
models.py
class Vehicle(models.Model):
make = models.CharField(max_length=300)
model = models.CharField(max_length=300)
year = models.IntegerField()
miles = models.IntegerField()
sold_on = models.DateTimeField(null=True, blank=True)
sale_price = models.FloatField(null=True, blank=True)
purchase_price = models.FloatField(null=True, blank=True)
所以问题是:这两个类是否应合并为一个?或者创建另一段代码来创建业务对象,然后从业务对象填充模型。那么处理这个问题的最佳方法是什么?
答案 0 :(得分:0)
我无法评论,因为我没有足够的代表。基本上来自模型视图控制器ViewModel类型的环境有些人会说你应该有你的django模型类的域模型,然后有一个用于视图的模型。
在Django中,我发现这个设置很愚蠢而且根本不能保存。如果你的viewmodel和域模型差别那么大,我只想让Django应用程序返回json数据,并让像React这样的客户端框架构建你的UI。
由于Django ORM对象与ViewModel对象相同,因此不需要两个完全相同或非常相似的对象浮动。
答案 1 :(得分:0)
如果将业务对象与持久性逻辑分开,那么与获得BO和持久层相比,能够运行测试的速度要快几百倍。
通常为了测试django建议应该放在模型中的逻辑,总是必须访问数据库。这样做会大大减慢您的测试速度。不幸的是,django并不是为了让逻辑与模型很容易分离而构建的(因为很多对象,比如admin和form类依赖于Models,而不是任何更高级别的实体)......很多人都有这个问题。我们有它!我的意思是我们有一个非django项目处理一些xml处理(大量数字运算),其中100多个测试在2秒内运行...然后我们有django项目还有100多个测试运行在大约一分钟。
您可以尝试中间方式:在模型中尽可能少地使用逻辑,并将尽可能多的逻辑放入services
层......您如何实现这一点取决于您,但我不是意识到有人这样做。
这是一个解释为什么将业务逻辑放在模型中并不理想的人: http://nando.oui.com.br/2014/04/01/large_apps_with_sqlalchemy__architecture.html