2016-06-20 21 views
0

Ich habe ein django 1.9-Projekt und benutze mongoengine, um eine Verbindung zur mongodb-Instanz herzustellen.python 3.6 mongoengine kann keine Ausnahme machen

Ich habe ein Modell wie folgt:

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) 

Eine Testklasse:

import web.models as models 
class test: 

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

Das Problem ist, dass ich nicht die DuplicateKeyError execption fangen kann:

pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: rockynode.employee.$email_1 dup key: { : "[email protected]" } 

Ich habe versucht, mit global try außer, aber es stürzt immer noch den Code mit einer DuplicateKeyError Ausnahme:

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

Für Informationen sind die folgenden Abhängigkeiten mit:

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

Reff : get-the-duplicate-value-on-duplicatekeyerror

Jede Hilfe wäre sehr bemerkenswert.Thx.

Antwort

1

Wie Sie sich in der Dokumentation sah, create gibt ein gespeichertes Dokument, so dass, wenn Sie es verwenden

  • Sie haben es nicht ein zweites Mal speichern
  • Sie Ausnahmen speichern fangen müssen in dort

    try: 
        employee = models.Employee.objects.create(
         email="[email protected]", 
         first_name="Pedro", 
         last_name="Kong" 
        ) 
    except Exception as e: 
        return "Error \n %s" % (e) 
    return "Business Tested" 
    

oder wenn Sie nicht schaffen, sondern in einer gesonderten Erklärung sparen:

employee = models.Employee(
     email="[email protected]", 
     first_name="Pedro", 
     last_name="Kong" 
    ) 
    try: 
     employee.save() 
    except Exception as e: 
     return "Error \n %s" % (e) 
    return "Business Tested" 
1

Ich habe das Problem zu lösen.

Die try except funktioniert nicht, da die DuplicateKeyError exception nicht von der save() Methode, sondern von der create() Methode ausgelöst wurde, wurde.

aus der Dokumentation Zitiert: create():

Neues Objekt erstellen. Gibt die gespeicherte Objektinstanz zurück.

Der Codeabschnitt in den def create() im mongoengine Code: Reff: Monogoengine code zeigt deutlich, dass die create() Funktion die save() Funktion aufruft:

Auszug aus mongoengine Code:

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

Daher meine try Blöcke müssen die create() Methode wie folgt umschließen: