数据库建表
检查model是否有效
python manage.py validate
生成create table语句
python manage.py sqlall books
同步数据库命令
python manage.py syncdb
Django Model的设计
如何设计出好的django model可能是最难也是最复杂的一个话题, 在此, 我们看看一些基本的技巧:
规范化
我们首先建议了解数据库规范化(database normalization). 如果你还不清楚这是什么, 那么, 我们强烈建议你先阅读一下相关的书籍, 或搜索”关系 型数据库设计”或”数据库规范化”. 在创建django model之前, 应当首先保证设计的数据库是规范化的.
cache
正确的使用cache能帮助我们提高数据库的性能. 详细的信息, 我们会在今后的文章中作进一步介绍.
何时使用null和blank
当定义model field时, 我们可以设置null=True和blank=True (默认都是False), 知道何时设置null和blank对于开发人员也是十分重要的, 在下 面的表格中, 我们一一列举了如何使用这两个选项:
Field 类型 | 设置null=True | 设置blank=True |
---|---|---|
CharField, TextField, SlugField, EmailField, CommaSeparatedIntegerField等 |
不要设置 django规定储存空字符串来代表空值, 当从数据库中读取NULL或空值时都为空字符串 |
可以设置 设置后允许接受widget中为空值(即不填写), 储存到数据库时空值变为空字符串 |
FileField, ImageField |
不要设置 django实际储存的是路径的字符串, 因此同上 |
可以设置 同上 |
BooleanField | 不要设置 因为有NullBooleanField代替 |
不要设置 |
IntegerField, FloatField, DecimalField等 |
可以设置 如果你希望在数据库中能储存NULL |
可以设置 设置后允许接受widget中为空值(即不填写), 设置为True时必须同时设置null=True |
DateTimeField, DateField, TimeField等 |
可以设置 如果你希望在数据库中能储存NULL |
可以设置 设置后允许接受widget中为空值(即不填写), 设置为True时必须同时设置null=True |
ForeignKey, ManyToManyField, OneToOneField |
可以设置 如果你希望在数据库中能储存NULL |
可以设置 设置后允许接受widget中为空值(即不填写) |
GenericIPAddressField | 可以设置 如果你希望在数据库中能储存NULL |
可以设置 设置后允许接受widget中为空值(即不填写) |
IPAddressField | 不推荐设置 用GenericIPAddressField代替 |
不推荐设置 用GenericIPAddressField代替 |
什么时候使用BinaryField
在django 1.6中, 新增了BinaryField, 用于储存二进制数据(binary data或 bytes). 对于BinaryField, 我们无法使用ORM的filters, excludes或其他SQL操作. 但在少数情况下, 我们会用到BinaryField, 例如MessagePack格式的内容, 传感器接受的原始数据和压缩数据等. 但需要注意 的是, Binary Data一般都十分庞大, 因此可能会拖慢数据库的速度. 如果发生这一现象, 我们可以将binary data储存在文件中, 然后使用FileField储 存该文件的路径信息.
还有, 不要从BinaryField中直接读取文件并呈献给用户. 因为,
- 从数据库读写总是比从文件系统读写慢;
- 数据库备份会变得十分庞大, 花费更多 的时间;
- 获得文件的过程, 增加了从django到数据库的这一环节.