如何使用Mongoengine REST将数据发布到嵌入式文档

时间:2019-05-16 07:53:00

标签: django-rest-framework mongoengine restframeworkmongoengine

我正在尝试将Django与mongoengine结合使用以制作API。

到目前为止,我可以获取对象并将其删除。但是当我想发布一些数据时。假设学生+课程出现错误:

type object 'Course' has no attribute 'objects'

Models 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

1 个答案:

答案 0 :(得分:0)

Document代表MongoDB文档(即集合中的记录),Document类绑定到特定集合。 EmbeddedDocument表示嵌套在Document中的结构。

因此,根据设计,除非将EmbeddedDocument嵌入文档中,否则它不会附加到任何集合中。

这意味着您无法查询或保存EmbeddedDocument类,需要查询/保存父文档。

Document.objects是用于查询集合的入口点,它仅存在于Document类上。您正在呼叫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)