Как отправить данные во встроенный документ с помощью Mongoengine REST - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь использовать Django с mongoengine для создания API.

Пока что я могу получить объекты и удалить их.но когда я хочу опубликовать некоторые данные.Допустим, студент + курс дает ошибку:

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

1 Ответ

0 голосов
/ 16 мая 2019

A Document представляет документ MongoDB (то есть запись в коллекции), класс Document привязан к определенной коллекции.EmbeddedDocument представляет собой структуру, которая вкладывается в документ.

Таким образом, дизайн EmbeddedDocument не прикрепляется ни к какой коллекции, если вы не внедрили его в документ.

Это означает, что вы можете 'Для запроса или сохранения класса EmbeddedDocument необходимо запросить / сохранить родительский документ.

Document.objects - это точка входа для запроса коллекции, она существует только в классах документа.Вы звоните 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)
...