从ExtractQuarter获取价值

时间:2018-08-17 21:26:55

标签: django django-models django-forms

我有一个Django模型。当填充此模型的表单完成时,我希望我的保存功能在用户输入的字段之一上使用新的ExtractQuarter数据库功能。基于ExtractQuarter产生的值,我想填充另一个对表单用户隐藏的字段。

但是,我无法弄清楚如何从ExtractQuarter实际获取值。

保存功能为:

servername:/home/user/logs $ cat kill.log
Fri Aug 17 15:06:51 CDT 2018
Error killing process: 9699556

Return code was: 0

这给了我

def save(self, *args, **kwargs):
    q = ExtractQuarter(self.fiscal_year_end).values.get()
    if q >= 3:
        y = ExtractYear(self.fiscal_year_end).Value()
    else:
        y = ExtractYear(self.fiscal_year_end).Value()-1
    self.fiscal_year = y
    super(ModelName, self).save(*args, **kwargs)

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

  

但是,我无法弄清楚如何从ExtractQuarter实际获取值。

不能。大多数 transformers (包括ExtractQuarter)都没有真正的语义逻辑。这将编写查询,而不是编写SELECT foo FROM bar,查询现在显示为SELECT QUARTER(foo) FROM bar。但是您不能在Python / Django级别使用此功能将datetime(或相关)对象转换为四分之一。

但是,我们可以“模仿”行为。例如,如果我们看看QUARTER function的定义,就会看到:

  

QUARTER函数返回四分之一(从14的数字)   给定一个日期值。

     
      
  • 一个月为1月至3月的日期将返回1
  •   
  • 一个月的四月至六月的日期将返回2
  •   
  • 日期为7月至9月的日期将返回3
  •   
  • 一个月为十月至十二月的日期将返回4
  •   

因此,我们可以像这样定义函数:

def obtain_quarter(dt):
    if dt is not None:
        return (2 + dt.month) // 3

def obtain_year(dt):
    if dt is not None:
        return dt.year

因此,您可以像这样使用它:

def save(self, *args, **kwargs):
    q = obtain_quarter(self.fiscal_year_end)
    self.fiscal_year = obtain_year(self.fiscal_year_end) - (q < 3)
    super(ModelName, self).save(*args, **kwargs)

答案 1 :(得分:1)

如果 fiscal_year_end 字段是python的DateTime object,您将获得四分之一,

import math


class Mymodel(models.Model):
    # your fields

    def save(self, *args, **kwargs):
        quarter = math.ceil(self.fiscal_year_end.month / 3)
        if quarter >= 3:
            self.fiscal_year = self.fiscal_year_end.year
        else:
            self.fiscal_year = self.fiscal_year_end - 1
        super(ModelName, self).save(*args, **kwargs)