Бессмысленная ошибка ValueError при создании объекта Model - PullRequest
2 голосов
/ 23 февраля 2012

У меня проблема с ошибкой, которую я не совсем понимаю. Когда я выполняю код, приведенный ниже, я получаю следующее сообщение:

ValueError: Cannot assign "[<Location: somename>]": "Event.location" must be a "Location" instance.

В нем четко указано, что «somename» имеет тип Location, но жалуется, что это неправильный тип .. что мне делать?К сожалению, переводчик не дает мне много подсказок: (

    if location is not None:
        location = location.group(1)
        l=Location.objects.filter(name=location)
        if not l:
            l = Location(name=location)
            l.save()

    if price is not None:
        price = price.group(1)

    if starttime is not None:
        starttime = extract_time_from_string(starttime.group(1))

    if name is not None:
        name = name.group(1)

    if edate is not None and name is not None and l is not None:
        if not Event.objects.filter(name = name, eventdate=edate,
                location = l):
            e= Event(location = l, name = name,
                    eventdate=edate, starttime=starttime,
                    price=price)

1 Ответ

5 голосов
/ 23 февраля 2012
ValueError: Cannot assign "[<Location: somename>]": "Event.location" must be a "Location" instance.

Когда говорится, что [<Location: somename>] пройдено, скобки означают, что это список.

Проблема в том, что переменная l может иметь разные типы в вашем коде.

Вот это QuerySet (совместимый со списком тип) Location:

l=Location.objects.filter(name=location)

Вот это место:

l = Location(name=location)

Вы должны убедиться, что l содержит местоположение в обоих случаях, например, с этим блоком else:

    l=Location.objects.filter(name=location)
    if not l:
        l = Location(name=location)
        l.save()
    else:
        l = l[0]

Поскольку вы пытаетесь получить один экземпляр местоположения, вы также можете использовать get() вместо filter():

try:
    l = Location.objects.get(name=location)
except Location.DoesNotExist:
    l = Location(name=location)
    l.save()

Вот в основном метод get_or_create():

l, created = Location.objects.get_or_create(name=location)

Типичная ошибка, на которую следует обратить внимание при использовании get_or_create (), это то, что он возвращает 2 значения. Первый - модель, второй - логическое значение, которое соответствует True, если объект был создан, и False, если он был найден.

Документация для get_or_create: https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

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