Невозможно присвоить 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")