ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – Django 1.7:传递未保存的实例会引发“不可避免的”异常

2019-06-12 07:44:06  阅读:237  来源: 互联网

标签:python django django-models django-1-7


我目前正在迁移到Django 1.7.我有一些信号传递未保存的模型实例,现在抛出TypeError:没有主键值的模型实例是不可用的.

我想知道Django pre_save信号如何在实例周围传递?我正在查看文档,甚至找到了在1.7(https://github.com/django/django/commit/6af05e7a0f0e4604d6a67899acaa99d73ec0dfaa)中实现此功能的提交,我只是不知道它是如何工作的.

有人可以向我解释pre_save是如何解决这个问题或者我如何绕过这个限制的吗?谢谢.

示例代码如下:

from django.dispatch import Signal

send_text = Signal()
unsaved_model = SomeModel()  # note that neither `create` or `.save()` are being called
send_text.send(sender=unsaved_model)  # error gets thrown when this gets called

追溯:

  File "/home/ubuntu/fangsterr-app/notifications/models.py", line 43, in send
    send_text.send(sender=self)
  File "/home/ubuntu/virtualenvs/venv-2.7.5/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 194, in send
    if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS:
  File "/home/ubuntu/virtualenvs/venv-2.7.5/lib/python2.7/site-packages/django/db/models/base.py", line 484, in __hash__
    raise TypeError("Model instances without primary key value are unhashable")
TypeError: Model instances without primary key value are unhashable

解决方法:

看起来Django将发送器存储在缓存中,用于在信号调度期间进行查找.这要求发件人是可清除的,这对没有pk的模型实例不起作用.

这不影响pre_save等的原因.按照惯例,发送者是模型类,而不是模型实例.该实例在其自己的参数中传递.见the documentation.

解决方案很容易使用类作为发送方,并将实例作为参数传递.

(如果这只是偶然事件之前的工作.修复的bug导致所有未保存的模型实例评估为相等.)

标签:python,django,django-models,django-1-7
来源: https://codeday.me/bug/20190612/1224436.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有