Django Unhasable Type List, хотя я передаю объект? (Поле многие ко многим) - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь запустить скрипт миграции для моего django приложения, но я продолжаю получать TypeError: unhashable type: 'list', хотя я явно передаю объект:

Я получаю:

 error line 87, in buildCisc
    c.exclusions.add(exclus)
line 944, in add
    self._add_items(
line 1119, in _add_items
    target_ids = self._get_target_ids(target_field_name, objs)
line 1059, in _get_target_ids
    target_ids.add(target_id)
TypeError: unhashable type: 'list'

когда я запускаю следующий код

...

        for ex in exclusionList:
            if len(Course.objects.filter(ID=ex)) > 0:  # exclusion course already exsists
                exclus = Course.objects.filter(ID=ex)
                c.exclusions.add(exclus[0])
            else:  # exclusion course does not exsist yet so we must create it first
                exclus = Course(ID=ex)
                exclus.save()
                c.exclusions.add(exclus) #this is line 87 causing the error

, где c - это объект курса, созданный в предыдущем коде, exclusions - это поле «многие ко многим» от курса к самому себе, «ex» - это просто строка. если я попытаюсь использовать exclus = Course.objects.create(ID=ex) вместо этого, это также дает ту же ошибку. Кажется, ошибка говорит о том, что исключение, которое я передаю c.exclusions.add, является списком, но это очень явно объект. Я даже пытался переключить exclus на exclus [0], чтобы увидеть, почему он почему-то думал, что это список, но это дало мне error: Course Object not iterable, поэтому он говорит, что он имеет тип Object, поэтому я очень запутался с сообщением об ошибке. какие-нибудь идеи?

редактировать: я думаю, что решить проблему, проблема была exclus = Course(ID=ex), в частности ex. По какой-то причине в моей фазе чтения он каким-то образом был установлен в список, а не в строку, как я думал, это было

1 Ответ

0 голосов
/ 17 февраля 2020

Поскольку c является объектом курса, он содержит список, и эта часть не может быть хеширована. Попробуйте использовать .append() вместо .add(). Метод add() предназначен для наборов, и для него требуется хеширование объекта, поскольку ему необходимо сравнивать элементы на предмет уникальности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...