Django 2 столбца DB как FK в одну и ту же связанную таблицу
У меня есть таблица 'Athletes' и другая таблица 'Parents'.
Полями таблицы являются:
ATHLETES
reg_number
first_name
last_name
gender
age_group (as FK to AgeGroup)
parent_1 (as FK to Parents using related_name='parent_1')
parent_2 (as FK to Parents using related_name='parent_2')
PARENTS
first_name
last_name
email
phone
У меня это работает в консоли администратора, где я могу добавить родителей к спортсменам.
У меня есть форма, которая отображает связанных родителей для каждого спортсмена.
Проблема в том, что я пытаюсь обновить родителя для данного спортсмена. В POST указаны правильные идентификаторы parent_1 и parent_2, но в браузере я получаю следующую ошибку
ValueError at /save_athlete
Cannot assign "'1'": "Athletes.parent_1" must be a "Parents" instance.
POST имеет следующие данные в полезной нагрузке
id: 1
reg_number: 12345
group: 2
first_name: amy
last_name: small
gender: Female
parent_1: 1
parent_2: 2
Я не понимаю, в чем ошибка, поэтому не уверен, какой код было бы полезно опубликовать здесь.
Я ожидал, что значения parent_1
и parent_2
(id
) будут приняты при валидации формы, но в views.py
Иностранные ключи принимают id
, но только если они правильного типа. Если посмотреть на сообщение об ошибке внимательнее:
Cannot assign "'1'": "Athletes.parent_1" must be a "Parents" instance.
Вы увидите, что '1'
- это строка, а не целое число. Мы не видим ваш код, но преобразование его в int
должно решить проблему.
Я решил свою проблему. Когда я добавил 2 родительских FK в модель, я не обновил forms.py, чтобы в нем появился дополнительный код, который использовали групповые FK.
код def_clean_group был существующим..... Я скопировал пример для родителя_1, и ошибка переместилась на родителя_2. Создал запись для родителя_2 и проблема решилась.
def clean_group(self):
group = self.data['group'] if (self.data['group']).isnumeric() else 0
try:
group = models.Groups.objects.get(pk = group)
return group
except:
raise forms.ValidationError("Invalid Selected.")
def clean_parent_1(self):
parent_1 = self.data['parent_1'] if (self.data['parent_1']).isnumeric() else 0
try:
parent_1 = models.Parents.objects.get(pk = parent_1)
return parent_1
except:
raise forms.ValidationError("Invalid Selected.")
def clean_parent_2(self):
parent_2 = self.data['parent_2'] if (self.data['parent_2']).isnumeric() else 0
try:
parent_2 = models.Parents.objects.get(pk = parent_2)
return parent_2
except:
raise forms.ValidationError("Invalid Selected.")