【问题标题】:Where to put model related logic in Django project that is not instance related在与实例无关的 Django 项目中放置模型相关逻辑的位置
【发布时间】:2016-04-01 01:33:07
【问题描述】:

我有一个代码 sn-p 来选择表中的最后一个日期,然后执行一些逻辑来获取一个新日期。这个逻辑应该放在 django 项目中的什么地方?我已经看到了 Fat Models 的示例,其中逻辑作为模型的方法被放置,但据我所知,这只适用于实例。

# models.py
class PurchasesDetails(models.Model):
    purchaseid = models.AutoField(primary_key=True)
    effectivedate = models.DateField()

    def getselecteddate(self):
        lastdate = PurchasesDetails.objects.filter().aggregate(Max('effectivedate'))
        lastdate = next (iter (lastdate.values()))
        thisweekday = lastdate.weekday()
        advancedays = 1
        if thisweekday ==4:
            advancedays = 3
        thisdate = (lastdate + timedelta(days=advancedays))

        return thisdate

【问题讨论】:

标签: python django business-logic


【解决方案1】:

official docs 中所述,model manager 看起来是定义此类逻辑的最佳位置

在模型上定义自定义方法以添加自定义“行级” 您的对象的功能。而 Manager 方法旨在 做“表范围”的事情,模型方法应该作用于特定的模型 实例。

这是一种将业务逻辑保存在一个地方的宝贵技术—— 模型。

所以,例如,在你的情况下

class _DetailsManager(models.Manager):

    def getselecteddate(self):
        lastdate = PurchasesDetails.objects.filter().aggregate(Max('effectivedate'))
        lastdate = next (iter (lastdate.values()))
        thisweekday = lastdate.weekday()
        advancedays = 1
        if thisweekday == 4:
            advancedays = 3
        thisdate = (lastdate + timedelta(days=advancedays))

        return thisdate

class PurchasesDetails(models.Model):
    purchaseid = models.AutoField(primary_key=True)
    effectivedate = models.DateField()
    objects = _DetailsManager()

new_date = PurchasesDetails.objects.getselecteddate()

请阅读here 专门用于自定义模型管理器的特定文档。

【讨论】:

  • 谢谢宾奇亚。 _DetailsManager(models.Model) 类应该是 _DetailsManager(models.Manager) 类吗?当我在模型本身中引用 _DetailsManager 时,我也收到一个错误
  • 是的,很抱歉,我是在家里拍摄的,没有完全完成剪辑。关于undefined 这真的很奇怪,它在我的代码中有效。如果您认为我的回答比其他人的回答正确并更好地解决了您的问题,请将其标记为已接受。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多