Python Django,数据库中的存储函数

Python Django,数据库中的存储函数,python,django,model,functional-programming,Python,Django,Model,Functional Programming,我试图找到一种在Django模型中存储函数的方法。 我的用例是一个有计划和有条件发送的电子邮件发送系统 “如果John未登录,请明天发送此电子邮件” 理想情况下,我想创建带有测试功能字段的电子邮件 def my_test(instance): if (now() - instance.user.last_login) > timedelta(days=1): return False return True Email(send_later_date=now() + ti

我试图找到一种在Django模型中存储函数的方法。 我的用例是一个有计划和有条件发送的电子邮件发送系统

“如果John未登录,请明天发送此电子邮件”

理想情况下,我想创建带有测试功能字段的电子邮件

def my_test(instance):
  if (now() - instance.user.last_login) > timedelta(days=1):
    return False
  return True

Email(send_later_date=now() + timedelta(days=1),
      conditional=my_test)
这就是我的想法

import importlib

Email(send_later_date=now() + timedelta(days=1),
      conditional='my_app.views.my_test')



class Email(models.Model):
  send_later_date = models.DateTimeField(null=True, blank=True)
  conditional = models.TextField()

  def send_email(self):
    if self.send_later_date < now():
      if not self.conditional:
        function_send_email()
      else:
        function_string = self.conditional
        mod_name, func_name = function_string.rsplit('.',1)
        mod = importlib.import_module(mod_name)
        func = getattr(mod, func_name)
        if func():
          function_send_email()
导入导入库
电子邮件(发送日期=现在()+时间差(天数=1),
条件='my_app.views.my_test')
班级电子邮件(models.Model):
send_later_date=models.DateTimeField(null=True,blank=True)
条件=models.TextField()
def发送电子邮件(自我):
如果self.send\u later\u date

你会怎么做?我正在考虑将函数名存储在文本字段中。一旦需要,您将如何运行它
ImportLib
似乎很有趣……

存储函数名是一种有效的方法,因为它实际上是。这样做的好处是(在您的情况下),如果您更新函数的代码,它将自动应用于现有电子邮件(但要注意向后兼容性)

为了方便和安全(特别是如果函数名可能来自用户输入),您可能希望将所有此类函数保留在同一个模块中,并且只将函数名存储在DB中,而不是完整的导入路径中。因此,您可以简单地导入函数库并使用
getattr
读取它。我想您也会希望为这些函数提供参数。如果您不想将自己限制为给定数量/顺序/类型的参数,可以将字典作为JSON字符串存储在DB中,并使用
**
运算符展开它

import my_app.func_store as store
import json

func = getattr(store, self.conditional)
params = json.loads(self.conditional_params)
if func(**params):
    function_send_email()

回答得好。用户不能输入任何功能或代码,所有电子邮件都是从代码中生成的。因此,将条件函数放在生成电子邮件的位置附近非常方便。我目前有一个集中版本的这个电子邮件应用程序,这是一个噩梦保持。这就是我研究这个想法的原因…-)