学习Django之学习篇01

今天向此网站学习 - Django 开发内容管理系统:https://code.ziqiangxuetang.com/django/django-cms-develop.html
记录不懂的知识,记录犯下的错误,沉淀&总结

Q: 别人源码中写着 from __future__ import unicode_literals


A: 在Python中有些库的接口要求参数必须是str类型字符串,有些接口要求参数必须是unicode类型字符串。
    对于str类型的字符串,调用len()和遍历时,其实都是以字节为单位的,这个太坑爹了,同一个字符使用不同的编码格式,长度往往是不同的。
    对unicode类型的字符串调用len()和遍历才是以字符为单位,这是我们所要的。
  另外,Django,Django REST framework的接口都是返回unicode类型的字符串。
    为了统一,我个人建议使用from future import unicode_literals,将模块中显式出现的所有字符串转为unicode类型,不过,对于必须使用str字符串的地方要加以注意。
关于字符串类型,也是Python2坑爹的地方

Q :Django 迁移MySQL数据库之2处报错,
报错1: django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.33 or newer is required; you have 0.x.x.
报错2:AttributeError: ‘str’ object has no attribute ‘decode’


A:在命令行窗口复制报错代码位置,进入对应目录***释上对应行数的代码即可。一般位于,安装环境\Lib\site-packages\django\db\backends\mysql文件夹。


报错1 base.py 中的35,36行,报错语句:`# if version < (1, 3, 13):
raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % Database.version)


报错2 operations.py中的145,146 行,报错语句:if query is not None: query = query.decode(errors='replace')

Q: max_length=256 为何报错?
pymysql.err.InternalError: (1071, 'Specified key was too long; max key length is 767 bytes')


A: 创建数据库时,一般指定编码格式和忽略大小写,例如在命令行创建数据库,create database 数据库名 charset utf8 collate utf8_general_ci;
charset utf8指定编码格式为utf-8,collate utf8_general_ci表示忽略大小写。如果不忽略大小写则写为COLLATE utf8_bin


(1) 在mysql 5.5.3之前,mysql的InnoDB引擎,要求设置的主键长度不得超过767bytes。mysql的MyIsam引擎的主键长度不得超过1000 bytes。
(2) 在mysql中,gbk字符集会占用2个字节。utf8字符会占用3个字节。
而且从mysql5.5.3之后的版本,mysql 开始支持utf8m4字符,代表着一个字符占用4个字节。


Q : 如何避免?
A : 1 - 修改字符长度 2 - 升级数据库版本
参考自:https://blog.****.net/LJFPHP/article/details/80406907


题外:
字符串将占用的磁盘空间取决于它的长度(很小的开销),而不取决于字段的最大长度.使用较高的max_length不会增加数据库使用的磁盘空间.

Q: Django设置字段时, null=True 和 blank=True的区别


A: null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空,即在Null字段显示为YES。
blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填,但是对数据库来说,没有任何影响

Q: 为何Django2.0以后,ForeignKey必须加on_delete=models.CASCADE参数?


A: on_delete=models.CASCADE 级联删除,也就是当删除主表的数据时候从表中的数据也随着一起删除
因为在Django2.0 之前,ForeignKey 中on_delete=models.CASCADE为默认参数。 此外OneToOneField 也需要此参数,而ManyToManyField没有 on_delete 参数,所以忽略。


并且on_delete 有5中参数:
学习Django之学习篇01
参考自刘江的博客:http://www.liujiangblog.com/course/django/96

Q: django模型中auto_now和auto_now_add的区别


A: auto_now 无论是你添加还是修改对象,时间为你添加或者修改的时间。
auto_now_add 为创建时的时间,更新对象时不会有变动。
若想在admin后台修改时,可在字段中添加 editable=True

Q: Django中 对标的操作 get_or_create 如何理解?


A: 语法为: model名.objects.get_or_create(defaults=None, **kwargs)
一个通过给出的kwargs来查询对象的便捷方法
返回一个由(object, created)组成的元组,元组中的object 是一个查询到的
或者是被创建的对象, created 是一个表示是否创建了新的对象的布尔值。