django模型类中的keyerror __init__

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)

Joh*_*kin 7

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: ...).这样,您传递给构造函数的链接将不会被覆盖.