这是我写的一个 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: ...)。这样,您传递给构造函数的链接就不会被覆盖。
