将模型相关逻辑放在Django项目中与非实例相关的位置

时间:2015-12-26 15:08:16

标签: python django business-logic

我有一个代码片段来选择表中的最后一个日期,然后执行一些逻辑来获取新的日期。这个逻辑应该放在一个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

1 个答案:

答案 0 :(得分:0)

正如official docs中所述,model 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专用于自定义模型管理器的特定文档。