创建Model对象时的无意义ValueError

时间:2012-02-23 18:58:59

标签: python mysql django

我有一个错误的问题我不太明白.. 当我执行下面的代码时,我得到以下消息:

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 个答案:

答案 0 :(得分:5)

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

当它表示[<Location: somename>]已通过时,括号表示它是一个列表。

问题是l变量在代码中可以有不同的类型。

这是Location的一个QuerySet(列表兼容类型):

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