如何将业务对象保存到Django模型中

时间:2015-04-28 22:07:24

标签: python django class oop model

我有两个相似的类,一个是业务对象,第二个是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)

所以问题是:这两个类是否应合并为一个?或者创建另一段代码来创建业务对象,然后从业务对象填充模型。那么处理这个问题的最佳方法是什么?

2 个答案:

答案 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