Невозможно присвоить 3, должен быть экземпляр модели при массовом создании в django rest

Я пытаюсь выполнить массовое создание и обновление в представлении. Однако при массовом создании возникает следующая ошибка.

ValueError: Cannot assign "3": "LmsGrade.exam" must be a "LmsExamModel" instance.

Я уже несколько раз выполнял bulk_create, но ни разу он не запрашивал экземпляр вместо id. Но я думаю, что это потому, что я сделал это в классе сериализатора, а класс сериализатора предварительно проверяет все перед выполнением операции.

Мои модели:

class LmsGrade(TimeStampAbstractModel):

    exam = models.ForeignKey(
        "lms_exam.LmsExamModel", on_delete=models.CASCADE, related_name="lms_grades"
    )

    student = models.ForeignKey(
        Student, on_delete=models.CASCADE, related_name="grades"
    )

    marks_obtained = models.PositiveIntegerField(blank=True)

    grade_obtained = models.CharField(max_length=2, blank=True)

    present = models.BooleanField(default=True)

Мое мнение:

def create(self, request, *args, **kwargs):
    grades = self.request.data
    grades_to_create = []
    grades_to_update = []

    grades = [
        {
            "id": LmsGrade.objects.filter(
                exam_id=grade.get("exam"),
                student_id=grade.get("student"),
            )
                .first()
                .id
            if LmsGrade.objects.filter(
                exam_id=grade.get("exam"),
                student_id=grade.get("student"),

            ).first()
               is not None
            else None,
            **grade,
        }
        for grade in grades
    ]

    [
        grades_to_update.append(grade)
        if grade["id"] is not None
        else grades_to_create.append(grade)
        for grade in grades
    ]

    [grade.pop("id") for grade in grades_to_create]

    LmsGrade.objects.bulk_create(
        [LmsGrade(**item) for item in grades_to_create]
    )

    # test = [LmsGrade(**item) for item in grades_to_create]
    LmsGrade.objects.bulk_update(
        [
            LmsGrade(id=item.get("id"), marks_obtained=item.get("marks_obtained"),grade_obtained=item.get("grade_obtained"),present=item.get("present"))
            for item in grades_to_update
        ],
        ["value"],
        batch_size=1000
    )
    qs = LmsGrade.objects.filter(exam__id=request.data.get("exam"))
    serializer = self.get_serializer(data=qs, many=True)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data, status=200)

В приведенном выше коде все работает нормально до тех пор, пока он не столкнется с разблокировкой **item в строке

LmsGrade.objects.bulk_create(
            [LmsGrade(**item) for item in grades_to_create]
        )

Я не понимаю. Я делал распаковку раньше и никогда не сталкивался с такой проблемой.

Мой сериализатор:

class GradebookTestSerializer(serializers.ModelSerializer):
    class Meta:

        model = LmsGrade
        fields = [
            "id",
            "exam",
            "student",
            "marks_obtained",
            "grade_obtained",
            "present",
        ]

Вы используете "id" для ссылки на внешний ключ без использования _id. Вы можете попробовать следующее

LmsGrade.objects.bulk_create(
    [LmsGrade(**item) for item in grades_to_create]
)

на что-то похожее на ваше массовое обновление и попробуйте

LmsGrade.objects.bulk_create(
            [LmsGrade(exam_id=item.get("exam"),student_id=item.get("student"),marks_obtained=item.get("marks_obtained"),grade_obtained=item.get("grade_obtained"),present=item.get("present")) for item in grades_to_create])

exam_id=item.get("exam")

student_id=item.get("student")

Вернуться на верх