这是我写的一个 Django 模型类。当我从 Django 调用 get_object_or_404
时,这个类得到一个 keyerror(我认为 keyerror 是由于 get 函数没有将 kwargs 传递给 __init__
而引发的,参数都是位置的) .有趣的是,当我从控制台调用 get_object_or_404
时,它没有出现错误。
我想知道为什么,下面的代码是否是构造此类的正确方法(即,使用 init 填充链接字段)。
class Link(models.Model)
event_type = models.IntegerField(choices=EVENT_TYPES)
user = models.ForeignKey(User)
created_on = models.DateTimeField(auto_now_add = True)
link = models.CharField(max_length=30)
isActive = models.BooleanField(default=True)
def _generate_link(self):
prelink = str(self.user.id)+str(self.event_type)+str(self.created_on)
m = md5.new()
m.update(prelink)
return m.hexdigest()
def __init__(self, *args, **kwargs):
self.user = kwargs['user'].pop()
self.event_type = kwargs['event_type'].pop()
self.link = self._generate_link()
super(Link,self).__init__(*args,**kwargs)
最佳答案
self.user = kwargs['user'].pop()
self.event_type = kwargs['event_type'].pop()
您正在尝试从字典中检索一个条目,然后调用它的 pop 方法。如果要从字典中删除并返回对象,请调用 dict.pop()
:
self.user = kwargs.pop('user')
当然,当 kwargs
中不存在 "user"
时,这将失败并返回 KeyError
。您需要为 pop 提供默认值:
self.user = kwargs.pop('user', None)
这意味着“如果“user”
在字典中,删除并返回它。否则,返回None
”。
关于另外两行:
self.link = self._generate_link()
super(Link,self).__init__(*args,**kwargs)
super().__init__()
会将 link
设置为某个东西,可能是 None
。我会颠倒线条,像这样:
super(Link,self).__init__(*args,**kwargs)
self.link = self._generate_link()
你可能想在设置链接之前添加一个测试,看看它是否已经存在(if self.link is not None: ...
)。这样,您传递给构造函数的链接就不会被覆盖。
关于python - django 模型类 __init__ 中的 keyerror,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/866399/