如何使用 Mongoengine REST post 数据到嵌入式文档
How to post data to Embedded document with Mongoengine REST
我正在尝试将 Django 与 mongoengine 结合使用来制作 API。
到目前为止我可以获取对象并删除它们。但是当我想要 post 一些数据时。假设学生 + 课程出现错误:
type object 'Course' has no attribute 'objects'
模型 en ..
#Model.py
class Course(EmbeddedDocument):
course_name = StringField(max_length=200)
course_fee = StringField(max_length=200)
class Student(Document):
student_name = StringField(max_length=200)
student_contactperson = StringField(max_length=200)
student_adress = StringField(max_length=200)
courses = ListField(EmbeddedDocumentField(Course))
#Serializers.py
class CourseSerializer(EmbeddedDocumentSerializer):
class Meta:
model = Course
fields = ('course_name','course_fee')
class StudentSerializer(DocumentSerializer):
courses = CourseSerializer(many=True)
class Meta:
model = Student
fields = ('student_name','student_contactperson','student_adress','courses')
depth = 2
def create(self, validated_data):
course_data = validated_data.pop('courses')
student = Student.objects.create(**validated_data)
Course.objects.create(student=student, **course_data)
return student
#Views.py
class StudentViewSet(meviewsets.ModelViewSet):
lookup_field = 'name'
queryset = Student.objects.all().order_by('-date_joined')
serializer_class = StudentSerializer
一个Document
表示一个MongoDB文档(即集合中的一条记录),一个文档class绑定到一个特定的集合。 EmbeddedDocument 表示嵌套在文档中的结构。
因此,根据设计,EmbeddedDocument 不会附加到任何集合,除非您将其嵌入到 Document 中。
这意味着您无法查询或保存 EmbeddedDocument class,您需要 query/save 父文档。
Document.objects
是查询集合的入口,只存在于Document classes上。您正在调用 Course.objects.create
,但 Course
是一个 EmbeddedDocument。
我认为您需要将代码更改为以下内容
class StudentSerializer(DocumentSerializer):
...
def create(self, validated_data):
course_data = validated_data.pop('courses')
course = Course(**course_data) # assuming course_data is {course_name: ..., course_fee: ...}
return Student.objects.create(courses=[course], **validated_data)
我正在尝试将 Django 与 mongoengine 结合使用来制作 API。
到目前为止我可以获取对象并删除它们。但是当我想要 post 一些数据时。假设学生 + 课程出现错误:
type object 'Course' has no attribute 'objects'
模型 en ..
#Model.py
class Course(EmbeddedDocument):
course_name = StringField(max_length=200)
course_fee = StringField(max_length=200)
class Student(Document):
student_name = StringField(max_length=200)
student_contactperson = StringField(max_length=200)
student_adress = StringField(max_length=200)
courses = ListField(EmbeddedDocumentField(Course))
#Serializers.py
class CourseSerializer(EmbeddedDocumentSerializer):
class Meta:
model = Course
fields = ('course_name','course_fee')
class StudentSerializer(DocumentSerializer):
courses = CourseSerializer(many=True)
class Meta:
model = Student
fields = ('student_name','student_contactperson','student_adress','courses')
depth = 2
def create(self, validated_data):
course_data = validated_data.pop('courses')
student = Student.objects.create(**validated_data)
Course.objects.create(student=student, **course_data)
return student
#Views.py
class StudentViewSet(meviewsets.ModelViewSet):
lookup_field = 'name'
queryset = Student.objects.all().order_by('-date_joined')
serializer_class = StudentSerializer
一个Document
表示一个MongoDB文档(即集合中的一条记录),一个文档class绑定到一个特定的集合。 EmbeddedDocument 表示嵌套在文档中的结构。
因此,根据设计,EmbeddedDocument 不会附加到任何集合,除非您将其嵌入到 Document 中。
这意味着您无法查询或保存 EmbeddedDocument class,您需要 query/save 父文档。
Document.objects
是查询集合的入口,只存在于Document classes上。您正在调用 Course.objects.create
,但 Course
是一个 EmbeddedDocument。
我认为您需要将代码更改为以下内容 class StudentSerializer(DocumentSerializer): ...
def create(self, validated_data):
course_data = validated_data.pop('courses')
course = Course(**course_data) # assuming course_data is {course_name: ..., course_fee: ...}
return Student.objects.create(courses=[course], **validated_data)