我有一个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)
感谢您的帮助。
答案 0 :(得分:1)
但是,我无法弄清楚如何从
ExtractQuarter
实际获取值。
您不能。大多数 transformers (包括ExtractQuarter
)都没有真正的语义逻辑。这将编写查询,而不是编写SELECT foo FROM bar
,查询现在显示为SELECT QUARTER(foo) FROM bar
。但是您不能在Python / Django级别使用此功能将datetime
(或相关)对象转换为四分之一。
但是,我们可以“模仿”行为。例如,如果我们看看QUARTER
function的定义,就会看到:
QUARTER
函数返回四分之一(从1
到4
的数字) 给定一个日期值。
- 一个月为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)