【问题标题】:Can you resave a Django object in same method你能用同样的方法重新保存一个 Django 对象吗
【发布时间】: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()

【问题讨论】:

    标签: django django-models django-views celery


    【解决方案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 出现问题,您也可以重新发送电子邮件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多