Django数据库操作易错点
1. 在view中增删改查数据库
遇到主键的数据修改,会新建一条数据而不是修改,例如:
try:id = CodeInfo.objects.get(goods_code=old_id).update(goods_code=new_id,)id.goods_code=new_idid.uni_code=new_uni_idid.save()messages.success(request,"修改成功")except:messages.error(request,"编号不存在")
不能取出数据然后修改主键值再save()
save的时候因为主键已改变,orm无法找到表中对应行,所以直接就create了
应该直接用.update()
修改为:
try:id = CodeInfo.objects.filter(goods_code=old_id).update(goods_code=new_id,uni_code=new_uni_id)messages.success(request,"修改成功")except:messages.error(request,"编号不存在")
问题解决!
2. 在跳转页面时 message显示
在views.py中操作
messages默认有几种类型,比如success,info,error,warning等,当然你也可以自定义一种类型。messages有两种添加方式,你可以在任何你想要显示消息提示的地方使用下面两种方法的任意一种.就是这么简单~
\# method messages.success(request,'Hello world.')messages.error(request,'I am wrong')\# method messages.add_message(request,messages.SUCCESS, 'Hello world.')
3. 1451 - Cannot delete or update a parent row: a foreign key constraint fails 问题的解决办法
MySQL库中有俩表,table1和table2,相互关联,在删除表的时候出错:
Cannot delete or update a parent row: a foreign key constraint fails。
很明显这是表关联生成的强制约束问题,在删除的时候回检查表之间的关联关系,从而导致无法删除。
解决办法:
SET foreign_key_checks = 0; // 先设置外键约束检查关闭drop table table1; // 删除表,如果要删除视图,也是如此SET foreign_key_checks = 1; // 开启外键约束检查,以保持表结构完整性
MySQL的环境变量中存在一个foreign_key_checks,这是默认检查外键的配置项,如果将其设置为0,
BUT
在Django中怎么操作还没找到,欢迎指导
4. 本地Django css修改后html没有变化
css被浏览器缓存了,清理一下浏览器缓存就可以了
5. Cannot assign A.id must be a B instance.类似的错误
参考自:https://www.cnblogs.com/Stitchez/p/9911581.html
意为无法分配给“3”这个uid号,“OrderList.uid”必须是一个“User”的实例,即“OrderList.uid”不能为“3”
在通过数据库sql语句上,我们习惯性insert into orderlist(uid) value(“3”)是可以正常增加数据的。
但是在通过Django操作数据库时,不需要写sql语句,通过模型操作数据库:
传值无法成功,其原因是因为orderlist表中的uid关联User表中的uid(主键),通过Django进行增操作时,Orderlist.uid需要一个User的实例(外键约束),将orderlist字典改成如下:
即可成功进行增操作。
类似的:
其他使用Django模型对数据库操作时,如有依赖关系,则参数的值也需要为一个对象,或查询到的外键是一个对象,例:
如果通过bid=o.bid用过滤查找 book表下bid的书名将会报错:
我们打印一下 o.bid:
结果为:
o.bid拿不到真正的id号,而是一个Book类型的对象,其原因是bid为关联Book表的外键约束,o.bid.bid才可以拿到想要的id值: