Ошибка типа при заполнении модели в Django с помощью UniqueConstraint

Я пытаюсь создать свой первый проект на Django, и у меня возникли некоторые проблемы при создании записи в моей модели Prevision (включая прогнозы продаж), которая имеет uniqueConstraint для обеспечения того, что существует только один прогноз между поставщиком (модель "Representada") и клиентом (модель "Cliente") для данного года (поле "Ano").

Мой файл models.py выглядит следующим образом:

После того как модели правильно перенесены, я вхожу в режим администратора и регистрирую поставщика (т.е. 'Representada') и клиента (т.е. 'Cliente') без каких-либо проблем. После регистрации каждого из них в базе данных я пытаюсь сделать то же самое с прогнозом (т. е. 'Prevision'), однако при попытке сделать это через режим администратора в веб-браузере я получаю в ответ ошибку сервера (500).

Пытаясь лучше понять, что происходит, я запустил оболочку, чтобы внимательнее посмотреть на ошибку:

Если я пытаюсь использовать число вместо экземпляра, как подсказывает ошибка TypeError, ситуация не улучшается:

>>> prev = Prevision(Ano='2023', Cliente=Cliente.objects.get(id='4'), Representada='3', Importe='100.00')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "D:\Documents\Trabajo\00_Ofrevit\Desarrollo\Lib\site-packages\django\db\models\base.py", line 543, in __init__
    _setattr(self, field.name, rel_obj)
  File "D:\Documents\Trabajo\00_Ofrevit\Desarrollo\Lib\site-packages\django\db\models\fields\related_descriptors.py", line 284, in __set__
    raise ValueError(
ValueError: Cannot assign "'3'": "Prevision.Representada" must be a "Representada" instance.

Я предполагаю, что проблема должна быть довольно очевидной для кого-то с небольшим опытом, и она должна быть каким-то образом связана с тем, что Prevision имеет uniqueConstraint для хранения псевдо-множественного поля PK помимо ключа id, автоматически вставляемого Django, но я просто не могу понять, где и почему... Любой совет буду очень признателен!

Посмотрите на свою pre_save сигнальную функцию:

@receiver(pre_save, sender=Prevision)
def comprobar_ano_prevision(sender, instance, **kwargs):
    representada = Representada.objects.get(id=instance.Representada)
    ...

Сначала попытка присвоить экземпляр в качестве ID, а затем попытка получить доступ к полю экземпляра из int (сообщения об ошибках), так:

Representada.objects.get(id=instance.Representada.id)
  1. не используйте верхний регистр в именах полей. Это не обязательно, но облегчит вам жизнь, так вы узнаете, что используете класс или экземпляр (или переменную)

    .
  2. согласно первому трассировочному бэку проблема в этой строке:

# Desarrollo\Company\BaseDatos\models.py", line 290
representada = Representada.objects.get(id=instance.Representada)

, потому что instance.Representada - это экземпляр, а не целое число. Вместо этого передайте pk:

# Desarrollo\Company\BaseDatos\models.py", line 290
representada = Representada.objects.get(id=instance.Representada.pk)

это должно исправить ошибку, но...

  1. ... вы делаете лишний запрос впустую. instance.Representada уже является экземпляром модели Representada (видите, почему важен пункт 1?), вы могли бы просто сделать:
representada = instance.representada
Вернуться на верх