python - Django - 在对象创建之前删除自身的变量?
问题描述
考虑这个片段:
if fire_prim is not None:
print('Fire Primary is definitely not Null, here is proof: {}'.format(fire_prim))
fire_primary_obj = LifeSafety.objects.create(
name='Fire Primary',
store=store_obj,
phone_line=fire_prim,
phone_line_provider=an_provider)
我们得到以下输出:
Fire Primary is definitely not Null, here is proof: +16077244546
Traceback (most recent call last):
File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:\Python\lib\site-packages\django\db\backends\sqlite3\base.py", line 298, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: stores_lifesafety.phone_line
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\admin-dksc104694\Desktop\Dev\it-database\scripts\data.py", line 246, in update_lifesafety_devices
fire_primary_obj = LifeSafety.objects.create(name='Fire Primary', store=store_obj, phone_line=fire_prim, phone_line_provider=an_provider)
File "C:\Python\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Python\lib\site-packages\django\db\models\query.py", line 413, in create
obj.save(force_insert=True, using=self.db)
File "C:\Python\lib\site-packages\django\db\models\base.py", line 718, in save
force_update=force_update, update_fields=update_fields)
File "C:\Python\lib\site-packages\django\db\models\base.py", line 748, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "C:\Python\lib\site-packages\django\db\models\base.py", line 831, in _save_table
result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "C:\Python\lib\site-packages\django\db\models\base.py", line 869, in _do_insert
using=using, raw=raw)
File "C:\Python\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Python\lib\site-packages\django\db\models\query.py", line 1136, in _insert
return query.get_compiler(using=using).execute_sql(return_id)
File "C:\Python\lib\site-packages\django\db\models\sql\compiler.py", line 1289, in execute_sql
cursor.execute(sql, params)
File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 100, in execute
return super().execute(sql, params)
File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 68, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:\Python\lib\site-packages\django\db\utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\Python\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:\Python\lib\site-packages\django\db\backends\sqlite3\base.py", line 298, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: stores_lifesafety.phone_line
我们可以 100% 确定地看到,在对象创建之前的行,fire_prim
其值+16077244546
应该作为phone_line
,但是在创建时它以某种方式被删除。
这是我的模型供参考:
class LifeSafety(models.Model):
name = models.CharField(max_length=40, default='unspecified')
store = models.ForeignKey(Store, null=True, on_delete=models.SET_NULL)
phone_line = PhoneNumberField()
phone_line_provider = models.ForeignKey(Provider, null=True, on_delete=models.SET_NULL)
last_verification = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
前置问题:
- 我已经在对象上允许Null并让代码运行 & 不出所料地创建了对象,但是
phone_line
是空白的。 - 我正在使用PhoneNumberField库。
- 我可以从 shell 中“模拟”这个确切的代码,并且每次都使用正确的值创建对象。
- 上面的片段完全如图所示,在打印
fire_prim
和创建尝试之间没有任何内容。
问题后:
- 更改
phone_line
为CharField而不是PhoneNumberField并且电话号码通过就好了。我也在他们的Github Repo上打开一个问题。 phone_line
在创建实例时显式使用字符串。再次验证这可以毫无问题地从 shell 完成。
输入: LifeSafety.objects.create(name='Fire Primary', store=store, phone_line='+16077244546')
输出: LifeSafety:Fire Primary(指示查询集)
有趣的是,当我在创建时明确使用该字符串时,该对象确实创建时phone_line
填充了该字符串,但我仍然收到错误消息。
输入:
print('Fire Primary is definitely not Null, here is proof: {}'.format(fire_prim))
fire_primary_obj = LifeSafety.objects.create(
name = 'Fire Primary',
store = store_obj,
phone_line = '+16077244546',
phone_line_provider = an_provider
)
输出与上面的堆栈跟踪相同(只有差异检查器中的名称差异)。
我可以进入管理员并看到它已创建,但我仍然得到NOT NULL constraint
异常。
解决方案
推荐阅读
- node.js - 当我重新加载太多次时网站崩溃
- python - 如何在父类的 __init__ 调用的方法中使用子类的属性
- angular - NgRx 效果 catchError 永远不会启动
- flutter - Flutter : 等待接收数据
- json - wdio cucumber json 记者在 Jira Xray 中的错误测试结果
- matlab - 如果包含函数定义,如何从命令行运行 matlab 文件?
- python - 我正在尝试从 Ballotpedia 中刮取美国国会议员的姓名
- java - 在所有测试类中的所有测试终止后在junit 5中运行代码
- optimization - 减小 main.js Angular 11 的大小
- amazon-web-services - AWS Bitnami EC2 和 EC2 无法以 Service Unavailable 启动