做班牌时候踩的坑
写在前面
这个文档记录一下我在开发班牌的时候踩的坑,避免以后在做的时候浪费时间。
1. 忘记在 settings 里面添加 app
大概建立完数据库表单后,发现数据库除了django自带的几个表单,我的的并没有更新,看了别人的操作,有人建议 empty 整个 migrations ,然后操作了一下,如下

发现问题是没有在 settings 里面声明 app。
2. 对 ForeignKey 理解不到位
makemigrations 时候报错,说是 ForeignKey 只能是 model 对象什么的,而你指定为了一个字段。
参见这个老哥的博客
数据库中一对多的关系,基本都是用 FK 来实现的。
3. 添加Url.py中的 url 格式问题
对于url 格式,添加的 view 方法是不能加 (),直接方法名就好了。
不然一直报错,当时在这个问题上花了一个小时,最后才发现是这么睿智的问题。
4. 数据类型的问题
在用 request.GET.get("") 获取参数时候,由于前端的参数可能传的是 str 格式,导致在做后面的逻辑比较的时候出了问题,这里在拿参数的时候,做一下强制类型转换。
5. ImgageField 的问题
这里有两个问题:
- 一个是 在 model 中创建相关的字段的时候,有一个参数 upload_to,指定上传的文件夹名;
- 另外一个是获取这个字段时候,字段是一个 ImageField 对象,一般我们用该对象的 url 属性。
6. 不能随便删除 Migrations 中 文件的问题
migrations 中的文件是和数据库中的结构相对应的,不能随便删除。
这里因因为我随便删除了文件,导致 migrate 无法正常使用,看到 migrations 时候有正常的文件,但是无法 migrate。
只能把整个库 dump 掉,新建一遍,带来的问题是,同时需要将数据重新写一遍,浪费了很多时间。
7. 一般来说不要把其他的字段置为 primary
数据库自动会产生 id 列作为唯一标识,一般来说不要将其他字段置为 primary key,这样就没有id列了。
可以看到接口文档中很多就要求有 id 这个字段。
8. 查询数据库时候,只要是返回多条数据,都不能print
比如说 filter 到一个tuple,如果直接想要查看一下中间结果,print,就会报错,相关类 没有 attribute 'name'。
所以直接把里面每一条拿出来用就行了,不要再打印了。
9. 使用 get_or_create() 方法后要 save()
要有一个 save() 才能保存,不然不会保存。
10. 在数据库表单设计中,最好都加上 null=True 选项
这个选项是用来指定该字段可以为空,即使这个字段是外键,这样做的话,在添加新的一条记录时候,比较方便,不需要在一次操作中要添加所有字段。
11. 关于 user 表单的扩展
django 提供了自动的用户管理密码授权机制。 auth_user 表和其他几个表给定了这个功能。
但是很多时候,这个 auth_user表提供的字段是不够用的。还是需要将这个表扩展一下。
但是这次因为先要实现功能,所以就没有扩展,用了其中已有的字段来代替。
具体扩展表的教程,自己跑一下,官方给出的方法,详见 这个老哥的博客
还有这样来扩展表单的,可以看一下。https://mypython.me/2019/01/12/vod-step-03/
12. 关于上传文件接口
其实很简单,但是有一个问题困扰了我一下,
from django.conf import settings
setting.BASE_DIR # 这样来用这个变量
13. 关于数据库导出与导入问题
后来给杨舒看我写的东西,然后要把我的数据库给他迁移一下。
这里有两个问题:
- win 下导出(dump) 要在命令行中执行
刚开始使用 navicat 备份出来的有问题。尽量不要用第三方的软件支持。 - 在杨舒的电脑上导入的时候报错,其实是mysql版本的问题。
这个问题参见 这个老哥的博客