python - django 模型类 __init__ 中的 keyerror

标签 python django django-models

这是我写的一个 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/

相关文章:

python - 缩进错误-Python

python - 从代码中调用和收集 py.test 的结果

python - 使用Python顺序读取txt文件

django - 为什么我的 Django 应用程序在 Azure 上失败且 UUID 语法无效

mysql - django 模型中的大型 json 数据会减慢任何查询速度

python - 如何在python中设置文件所有者?

python - Django - 序列化 parent 协会

django - Spark on YARN - 从 Django 提交 Spark 作业

python - Django 键违反唯一约束

django - 将实例传递给 Django 表单集