【问题标题】:How save business objects into Django Models如何将业务对象保存到 Django 模型中
【发布时间】:2015-07-07 23:27:21
【问题描述】:

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

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

【问题讨论】:

  • 澄清一下,问题不在于如何将新记录保存到 Django 模型中。我已经知道该怎么做,问题更多的是如何避免编码中的这种冗余。
  • 这取决于你真正想要什么。一般来说,如果你有重复,那就不好了,尤其是你有两个几乎相同的类。
  • 这是一个非常有趣的问题。无视投票!

标签: python django class oop model


【解决方案1】:

我无法发表评论,因为我没有足够的代表。基本上来自模型视图控制器 ViewModel 类型的环境,有些人会说你应该有域模型,它是你的 django 模型类,然后有一个用于视图的模型。

在 Django 中,我发现此设置很愚蠢,根本无法保存。如果您的视图模型和域模型差异如此之大,我只需让 Django 应用程序返回 json 数据,然后让 React 之类的客户端框架或类似的东西构建您的 UI。

没有必要让两个完全相同或非常相似的对象四处浮动,因为 Django ORM 对象将与您的 ViewModel 对象相同。

【讨论】:

    【解决方案2】:

    如果您将业务对象与持久性逻辑分开,您将获得比将 BO 和持久层结合起来快数百倍的惊人优势。

    通常为了测试 django 建议应该放在模型中的逻辑,总是必须访问数据库。这样做会大大减慢您的测试速度。不幸的是,django 的构建并不是为了让逻辑与模型非常容易分离(因为很多对象,比如 admin 和 form 类都依赖于模型,而不是任何更高级别的实体)......很多人都有这个问题。我们有它!我的意思是我们有 1 个非 django 项目处理一些 xml 处理(大量的数字运算),其中 100 多个测试在 2 秒内运行......然后我们有 django 项目也有 100 多个测试运行在大约一分钟。

    您可以尝试中间方法:尽可能少地在模型中加入逻辑,并在services 层中加入尽可能多的逻辑......不过,如何实现这取决于您自己,我不知道任何人这样做。

    下面有人解释了为什么将业务逻辑放入模型中并不理想: http://nando.oui.com.br/2014/04/01/large_apps_with_sqlalchemy__architecture.html

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 2022-10-14
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多