Skip to main content
 首页 » 编程设计

python之django 模型类 __init__ 中的 keyerror

2025年05月04日21mfryf

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