1

我正在尝试将 Django 与 mongoengine 一起使用来制作 API。

到目前为止,我可以获取对象并删除它们。但是当我想发布一些数据时。可以说学生+课程它给出了一个错误:

type object 'Course' has no attribute 'objects'

模特儿..

#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
4

1 回答 1

0

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

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

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

Document.objects是查询集合的入口点,它只存在于 Document 类中。您正在调用Course.objects.create,但Course它是一个 EmbeddedDocument。

我相信您需要将代码更改为以下类 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)
于 2019-05-16T19:14:09.883 回答