0

我有一个 django 1.9 项目,并且正在使用 mongoengine 连接到 mongodb 实例。

我有一个模型如下:

from django.db import models
from mongoengine import * 
class Employee(Document):
    email = StringField(required=True, unique=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)

一个测试类:

import web.models as models
class test:

    '''Test the accessibility of the business class'''
    def testBusiness():
        employee = models.Employee.objects.create(
            email="pedro.kong@company.com",
            first_name="Pedro",
            last_name="Kong"
        )
        try:
            employee.save()
        except pymongo.errors.DuplicateKeyError as e:
            return "Error"
        return "Business Tested"

问题是我无法捕捉到DuplicateKeyError执行:

pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: rockynode.employee.$email_1  dup key: { : "pedro.kong@company.com" }

我尝试了全局尝试,但它仍然使代码崩溃并出现DuplicateKeyError异常:

try:
    employee.save()
except:
    return "Error"
return "Business Tested"

有关信息,我正在使用以下依赖项:

Django==1.9.7
mongoengine==0.10.6
pymongo==3.2.2

参考:在重复键错误上获取重复值

任何帮助都将是非常可观的。谢谢。

4

2 回答 2

2

我得解决这个问题。

try except不起作用,因为不是从方法DuplicateKeyError exception触发save() 而是从create()方法触发。

引用文档:create()

创建新对象。返回保存的对象实例。

mongoengine 代码中的代码部分def create(): Reff: Monogoengine 代码清楚地表明该create()函数调用该save()函数:

从 mongoengine 代码中提取:

def create(self, **kwargs):
        """Create new object. Returns the saved object instance.
        .. versionadded:: 0.4
        """
        return self._document(**kwargs).save()

因此,我的try块必须包含create()如下方法:

 try:
            employee = models.Employee.objects.create(
                email="pedro.kong@company.com",
                first_name="Pedro",
                last_name="Kong"
            )
            employee.save()
        except Exception as e:
            return "Error \n %s" % (e)
        return "Business Tested"
于 2016-06-20T08:28:22.447 回答
2

正如您在文档中看到的那样,create返回一个保存的文档,所以如果您使用它

  • 你不必第二次保存它
  • 你必须在那里捕获保存异常

    try:
        employee = models.Employee.objects.create(
            email="pedro.kong@company.com",
            first_name="Pedro",
            last_name="Kong"
        )
    except Exception as e:
        return "Error \n %s" % (e)
    return "Business Tested"
    

或者如果您不使用 create 但保存在单独的语句中:

    employee = models.Employee(
        email="pedro.kong@company.com",
        first_name="Pedro",
        last_name="Kong"
    )
    try:
        employee.save()
    except Exception as e:
        return "Error \n %s" % (e)
    return "Business Tested"
于 2016-06-20T16:42:46.583 回答