Поле 'id' ожидало число, но получило объект <>ManyRelatedManager
Я пытаюсь удалить поле в отношениях "многие ко многим", но столкнулся с этой ошибкой и не знаю, как ее решить/исправить.
Вот что я пытаюсь сделать:
1: Перед приведенными ниже представлениями я получаю действительный POST от пользователя, идентифицирующего data.log_order
2: Я ищу, есть ли предыдущие журналы в ActiveSession
. Если есть, то ищу совпадающие журналы с одинаковыми полученными данными data.log_order
и удаляю существующие и добавляю новые полученные данные.
3: Если нет совпадения data.log_order
в журнале или предыдущих журналах, добавить новые полученные данные.
Насколько проста логика, настолько же сложна, насколько я пытаюсь исправить свои ошибки.
class Log(models.Model):
...................................
log_order = models.IntegerField(validators=[MinValueValidator(1)],blank=True, null=True)
class LogForm(forms.Form):
.............................
log_order = forms.IntegerField()
class ActiveSession(models.Model):
log = models.ManyToManyField(Log, related_name='savedlogs')
..................................
Вот мнения:
if active_session.log.values():
print(active_session.log.values())
for i in active_session.log.values():
if i['log_order']==int(data.log_order):
log_order = data.log_order
log=Log.objects.filter(log_order=log_order)
print(log)
active_session = ActiveSession.objects.get(id=ActiveSession.objects.last().id,log__in=log)
print(active_session)
active_session.log.remove(active_session.log)
active_session.log.add(data)
print(active_session.log.values())
else:
active_session.log.add(data)
print(active_session.log.values())
print('Existing Log with different order_no')
else:
active_session.log.add(data)
print('Log added to Session')
print(active_session.log.values())
return HttpResponseRedirect(url)
Вот трассировка:
Следующая строка кода является причиной ошибки:
active_session.log.remove(active_session.log)
Как указано в remove документации:
Для отношений "многие-ко-многим" remove() принимает либо экземпляры модели, либо значения полей в качестве аргумента *objs. либо значения полей, обычно первичные ключи, в качестве аргумента *objs.
То, что вы передаете в remove
- это менеджер поля "многие-ко-многим", а не один или несколько объектов.
Я не совсем уверен, какие объекты вы пытаетесь удалить из поля m2m, но если вы хотите удалить их все, вам следует либо использовать:
active_session.log.remove(active_session.log.all())
ИЛИ
active_session.log.clear()
Если вы хотите удалить только единичный объект, вам следует передать объект Log
:
active_session.log.remove(log)