Python Django,数据库中的存储函数
我试图找到一种在Django模型中存储函数的方法。 我的用例是一个有计划和有条件发送的电子邮件发送系统 “如果John未登录,请明天发送此电子邮件” 理想情况下,我想创建带有测试功能字段的电子邮件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
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()
回答得好。用户不能输入任何功能或代码,所有电子邮件都是从代码中生成的。因此,将条件函数放在生成电子邮件的位置附近非常方便。我目前有一个集中版本的这个电子邮件应用程序,这是一个噩梦保持。这就是我研究这个想法的原因…-)