2014-12-17 5 views
0

나는 데이터베이스를 생성해야하며 모든 항목이 데이터베이스에 입력되고 있는지 또는 파이썬 쉘을 사용하지 않는지 확인해야합니다. MongoEngine ValidationError

은 내가
class Trial(db.Document): 
    project_name = db.StringField(max_length=255,required=True) 
    list_of_materials = db.ListField(db.EmbeddedDocumentField('List_Of_Materials')) 
    abstract = db.StringField(max_length=255,required=True) 
    vehicle = db.StringField(max_length=255,required=False) 
    responsibilities = db.ListField(db.EmbeddedDocumentField('Responsibilities')) 

시험

라는 클래스를 쓴 다음과 같이 내가 클래스 List_of_Materials과 책임을 정의 :
class Responsibilities(db.EmbeddedDocument): 
    employee = db.StringField(max_length=255, required = True) 
    objective = db.StringField(max_length=255, required = True) 

class List_Of_Materials(db.EmbeddedDocument): 
    mat_name = db.StringField(max_length=255, required=True) 
    mat_type = db.StringField() 
    mat_comments = db.StringField(max_length = 255) 

는 지금은 데이터베이스에 항목을 만들기 위해 파이썬 쉘을 사용합니다.

trial_test = Trial(project_name = 'nio field trip management', 
       list_of_materials = [List_Of_Materials(mat_name = 'Laptop')], 
       abstract = 'All is well that ends well', 
       vehicle = Vehicle(veh_name='My Laptop',veh_num='GA07EX1234'), 
       responsibilities = [Responsibilities(employee='Prashant',objective='Setup the Website')], 

와 나는 다음과 같은 오류 얻을 : 코드의

Traceback (most recent call last): 
    File "<stdin>", line 12, in <module> 
    File "C:\Anaconda\lib\site-packages\mongoengine\base\document.py", line 85, in __init__ 
    value = field.to_python(value) 
    File "C:\Anaconda\lib\site-packages\mongoengine\base\fields.py", line 261, in to_python 
    self.error('You can only reference documents once they' 
    File "C:\Anaconda\lib\site-packages\mongoengine\base\fields.py", line 124, in error 
raise ValidationError(message, errors=errors, field_name=field_name) 
mongoengine.errors.ValidationError: You can only reference documents once they have been saved to the database 

LINE (12)이다 responsibilities=db.ListField(db.EmbeddedDocumentField('Responsibilities'))

내가 뭘 위의 오류에서 해석 할 수 것은 우리가에 첫 번째 항목을 가질 수 있다는 것입니다 "Responsibilities"클래스와 "List_Of_Material"클래스에 있지만 "List_Of_Material"의 항목은 "책임"의 항목에 위의 오류가 표시되는 동안 오류를 표시하지 않습니다.

이 문제를 방지하려면 어떻게해야합니까?

답변

3

보내시는 Trial 모델이 맞습니까?

이 ValidationError는 문서에 ReferenceField를 선언하고 참조 된 문서를 저장하기 전에이 문서를 저장하려고 할 때 throw됩니다 (Mongoengine은 MongoDB의 참조 필드를 클래스 및 참조의 ObjectId를 포함하는 사전처럼 나타냄)).

EmbeddedDocumentFieldReferenceField이 아닙니다. 주 문서와 동일한 시간에 저장됩니다. 따라서 귀하의 오류가 list_of_materials 또는 responsibilities 속성에서 발생한다고 생각하지 않습니다. 당신의 예제에서 차량 assigment를 제거하면,이 코드는 완벽하게 작동합니다. 코드 예제 감안할 때

, 나는 거기에

class Vehicle(db.Document): 
    veh_name = db.StringField() 
    veh_num = db.StringField() 

같은 클래스이며, 모델은 추측하고있다 :

class Trial(db.Document): 
    project_name = db.StringField(max_length=255, required=True) 
    list_of_materials = db.ListField(db.EmbeddedDocumentField('List_Of_Materials')) 
    abstract = db.StringField(max_length=255, required=True) 
    vehicle = db.ReferenceField(Vehicle) 
    responsibilities = db.ListField(db.EmbeddedDocumentField('Responsibilities')) 

그리고, 당신의 예는 다음과 같아야합니다

trial_test = Trial(
    project_name = 'nio field trip management', 
    list_of_materials = [List_Of_Materials(mat_name = 'Laptop')], 
    abstract = 'All is well that ends well', 
    vehicle = Vehicle(veh_name='My Laptop',veh_num='GA07EX1234'), 
    responsibilities = [Responsibilities(employee='Prashant',objective='Setup the Website')] 
) 
trial_test.vehicle.save() # Saving the reference BEFORE saving the trial. 
trial_test.save()