Метод Django Save выдает ошибку при попытке добавить новую запись в таблицу

У меня есть следующий код в представлении:

        lp_detail = LearningPathDetail()
        pos_in_path = 1
        lp_detail.lpheader_id = pk

        lesson_ids = request.POST["lesson_ids"].split(",")

        for lesson_id in lesson_ids:
            lp_detail.id = ""
            lp_detail.lesson_id = lesson_id
            lp_detail.pos_in_path = pos_in_path
            lp_detail.save()
            pos_in_path += 1

pk - это идентификатор из таблицы заголовков, который указывает на запись заголовка, идентифицирующую все связанные с ней подробные записи.

lesson_ids - это список идентификаторов DB, которые необходимо вставить в таблицу lp_detail.

Я думаю, что код должен сделать (согласно руководству), основываясь на том, что id пуст (я также пробовал установить его в None). это создать запись, но вместо этого я получаю ошибку:

Field 'id' expected a number but got ''.

Вот модель для таблицы LearningPathDetail:

class LearningPathDetail(models.Model):
    lpheader = models.ForeignKey(LearningPathHeader, on_delete=models.CASCADE)
    lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, blank=True, null=True)
    pos_in_path = models.IntegerField(default=1)

Я не уверен, что я здесь не прав.

Почему вы хотите установить значение id в пустую строку? Просто удалите эту строку:

lp_detail.id = ""

И пусть Django сам найдет хороший идентификатор.

Также, я думаю, вы хотите вот этого:

lp_detail = LearningPathDetail()

Внутри цикла. Вам может понадобиться новый объект с каждой итерацией.

Pk / Первичный ключ / Номер строки не может быть пустым.

Это должно быть что-то вроде: (и Django позаботится обо всех PK вещах

)
# get header
headerObj = LearningPathHeader.objects.get(pk=pk)

lesson_ids = request.POST["lesson_ids"].split(",")

pos_in_path = 1
for i in lesson_ids:
    # Get lesson Object
    lessonObj = Lesson.objects.get(pk=i)

    # create detail Obj
    LearningPathDetail.objects.create(
        lpheader= headerObj,
        lesson= lessonObj,
        opos_in_path= pos_in_path.
    )
    pos_in_path += 1

Если заголовок LearningPathHeader уникален для LearningPathDetail. (Например, только один путь может иметь заголовок 'science') Тогда вы просто хотите удалить все предыдущие пути

lesson_ids = request.POST["lesson_ids"].split(",")

headerObj = LearningPathHeader.objects.get(pk=pk)

# delete all the old Path!
LearningPathDetail.filter(lpheader=headerObj).delete()


pos_in_path = 1
for i in lesson_ids:
    lessonObj = Lesson.objects.get(pk=i)

    LearningPathDetail.objects.create(
        lpheader= headerObj,
        lesson= lessonObj,
        opos_in_path= pos_in_path.
    )
    pos_in_path += 1
Вернуться на верх