混淆使用 get queryset 和使用 pass 忽略异常并在我的 django 视图中继续

Confuse for using get queryset and using pass to ignore an exception and proceed in my django view

我写了一个视图来更新我的草稿对象,在更新我的草稿之前我需要查看数据库中是否存在 package(draft.package) 的草稿。
如果有可用的草稿,我需要更新该草稿的字段。

我正在使用 get 查询集查看数据库以检查草稿可用性。
我想知道在这里使用 get queryset 是不是好方法并将 pass 用于 except.

我的观点

def save_draft(draft, document_list):
    """    
    """    
    try:
        draft = Draft.objects.get(package=draft.package)
    except Draft.DoesNotExist as exc:
        pass
    except Draft.MultipleObjectsReturned as exc:
        raise CustomException
    else:
        draft.draft_document_list.filter().delete()

    draft.draft_document_list.add(*document_list)
    draft.save()

额外信息:

models.py

class Package(models.Model):
    name = models.CharField(max_length=100)
    # -- fields

class Document(models.Model):
    # -- fields
   
Class Draft(models.Model):
    # --- fields
    package = models.ForeignKey(Package)
    draft_document_list = models.ManyToManyField(Document)

我的算法:

  # first check to see if draft exists for package
  # if exists
      # overwrite draft_document_list with existed draft and save
  # if none exists
      # update passed draft object with draft_document_list

输入变量

save_draft(draft, document_list)
draft --> latest draft object
document_list --> list of documents mapped with Draft as M2M.

是的,对于您的模型和方法签名,您使用 get 是正确的。为了简化事情,您可以通过直接将 document_list 分配给 M2M 关系来摆脱 delete()/add() 方法。

def save_draft(draft, document_list):
    try:
        draft = Draft.objects.get(package=draft.package)
    except Draft.DoesNotExist:
        pass
    except Draft.MultipleObjectsReturned:
        raise CustomException
    draft.draft_document_list = document_list
    draft.save()

编辑:如果每个包裹只能有一份草稿,那你为什么要使用ForeignKey(Package)?使用 OneToOne 关系,您的代码将更加简单:

def save_draft(draft, document_list):
    draft.draft_document_list = document_list
    draft.save()