Метод 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