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.")
Вернуться на верх