您的位置:

解决方案:django ValueError("The name '%s' could not be hashed with %r." % (name, self))

  发布时间:2023-03-10 16:24:16
例如你也可以使用自定义对象作为字典的键,只要该对象实现了哈希函数和相等性操作符(即 `__hash__()` 和 `__eq__()` 方法使用例子是的,以下是一个使用自定义对象作为字典键的示例在这个例子中,我们定义了一个 `MyObject` 类,该类接受一个数值作为参数并存储在 `val` 属性中。我们还实现了 `__eq__()` 和 `__hash__()` 方法,使得 `MyObject` 对象可以作为字典的键。我们可以使用 `MyObject` 对象创建字典,并将对象用作键来存储值。

报错的原因

"ValueError: The name '%s' could not be hashed with %r." 这个错误通常是由于你在 Django 中尝试使用不可哈希的对象作为字典的键导致的。

例如,你可能会看到这个错误,如果你尝试将一个列表或字典作为字典的键存储,例如:


my_dict = {}
my_dict[[1, 2, 3]] = "list as a key"  # This will raise ValueError

或者:


my_dict = {}
my_dict[{"key": "value"}] = "dict as a key"  # This will raise ValueError

为了解决这个错误,你需要使用可哈希的对象作为字典的键,例如数字、字符串或元组。

例如:


my_dict = {}
my_dict[(1, 2, 3)] = "tuple as a key"  # This is valid
my_dict["key"] = "string as a key"  # This is also valid

如何解决

为了解决 "ValueError: The name '%s' could not be hashed with %r." 错误,你需要使用可哈希的对象作为字典的键。

例如,你可以将数字、字符串或元组用作字典的键,而不是列表或字典。

例如:


my_dict = {}
my_dict[(1, 2, 3)] = "tuple as a key"  # This is valid
my_dict["key"] = "string as a key"  # This is also valid

你也可以使用自定义对象作为字典的键,只要该对象实现了哈希函数和相等性操作符(即 `__hash__()` 和 `__eq__()` 方法)。


class MyObject:
    def __init__(self, val):
        self.val = val

    def __eq__(self, other):
        if isinstance(other, MyObject):
            return self.val == other.val
        return False

    def __hash__(self):
        return hash(self.val)

my_dict = {}
my_obj = MyObject(1)
my_dict[my_obj] = "custom object as a key"  # This is valid

使用例子

是的,以下是一个使用自定义对象作为字典键的示例:


class MyObject:
    def __init__(self, val):
        self.val = val

    def __eq__(self, other):
        if isinstance(other, MyObject):
            return self.val == other.val
        return False

    def __hash__(self):
        return hash(self.val)

my_dict = {}
my_obj = MyObject(1)
my_dict[my_obj] = "custom object as a key"

print(my_dict)  # Outputs: {<__main__.MyObject object at 0x7f45a8e7d400>: 'custom object as a key'}

在这个例子中,我们定义了一个 `MyObject` 类,该类接受一个数值作为参数并存储在 `val` 属性中。我们还实现了 `__eq__()` 和 `__hash__()` 方法,使得 `MyObject` 对象可以作为字典的键。

我们可以使用 `MyObject` 对象创建字典,并将对象用作键来存储值。在这个例子中,我们将字符串 "custom object as a key" 存储在字典中,其中键是一个 `MyObject` 对象。