如何使用 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)