sha*_*nyu 1 python django django-models
这是我写的Django模型类.当我get_object_or_404从Django 调用时,这个类得到了一个keyerror (我认为由于__init__get函数没有传递kwargs,所以引发了keyerror ,参数都是位置的).有趣的是,当我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)
Run Code Online (Sandbox Code Playgroud)
self.user = kwargs['user'].pop()
self.event_type = kwargs['event_type'].pop()
Run Code Online (Sandbox Code Playgroud)
您正在尝试从字典中检索条目,然后调用其pop方法.如果要从字典中删除并返回对象,请调用dict.pop():
self.user = kwargs.pop('user')
Run Code Online (Sandbox Code Playgroud)
当然,KeyError如果"user"不存在,这将失败kwargs.您需要为pop提供默认值:
self.user = kwargs.pop('user', None)
Run Code Online (Sandbox Code Playgroud)
这意味着"如果"user"在字典中,删除并返回它.否则,返回None".
关于另外两行:
self.link = self._generate_link()
super(Link,self).__init__(*args,**kwargs)
Run Code Online (Sandbox Code Playgroud)
super().__init__()可能会设置link一些东西None.我会颠倒这些线,就像这样:
super(Link,self).__init__(*args,**kwargs)
self.link = self._generate_link()
Run Code Online (Sandbox Code Playgroud)
您可能希望在设置链接之前添加测试,以查看它是否已存在(if self.link is not None: ...).这样,您传递给构造函数的链接将不会被覆盖.