你能用同样的方法重新保存一个 Django 对象吗

Posted

技术标签:

【中文标题】你能用同样的方法重新保存一个 Django 对象吗【英文标题】:Can you resave a Django object in same method 【发布时间】:2020-11-19 16:34:24 【问题描述】:

我有一个 django 函数,我在同一个函数中保存了两次对象。因为我需要 .delay (python celery) 函数中的对象的 id。使用.save()两次可以吗,还是不是很好的做法:

def some_function(request, emailname, emailbody):
    email = Email()
    email.name = emailname
    email.save()

    email_id = email.id
    celery_task = send_email.delay(email_id, emailbody)
    
    email.celery_task_id = celery_task.id
    email.save()

【问题讨论】:

【参考方案1】:

我的意见是把这个功能一分为二,划分职责。一个功能是创建一个电子邮件对象,另一个是发送电子邮件。这是必要的,因为有时您可能需要执行仅发送电子邮件或仅创建电子邮件对象之类的任务,此时您需要创建另一个函数或在此函数中放置一些 if..else

def some_function(request, emailname):
    email = Email()
    email.name = emailname
    email.save()

    return email.id
    
def send_email(email_id, emailbody):
    celery_task = send_email.delay(email_id, emailbody)
    
    email.celery_task_id = celery_task.id
    email.save()
    
    return email

创建class的理想方法,对象创建进入init并添加类方法send_email用于发送电子邮件

【讨论】:

我知道您的方法如何更好地将其拆分为两个函数。但是,您能否评论一下如果两次保存同一个实例没有技术问题,就像我在我的函数中所做的那样? 技术问题是 - 额外的数据库\存储调用来保存数据,但如果需要,则必须这样做。【参考方案2】:

使用这种方式没问题,因为你需要将email id存入celery task,然后再将celery id存回email对象中。

如果 celery 出现问题,您也可以重新发送电子邮件。

【讨论】:

以上是关于你能用同样的方法重新保存一个 Django 对象吗的主要内容,如果未能解决你的问题,请参考以下文章

你能用rails中的正则表达式做一个where find吗?

你能用链接调用一个servlet吗?

你能用一个好的 C# 例子来解释 Liskov 替换原则吗? [关闭]

你能用 Swifty-JSON 搜索 JSON 吗?

jQuery:你能用 jQuery 找到所选元素的不透明度吗?

你能用 JavaScript 判断一个元素是不是正在接触另一个元素吗?