我正在尝试将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
答案 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)