Django 不认识mysql

<form action="/get_msg/" method="post" enctype="multipart/form-data">
{% csrf_token %}

Django 并不认识mysql
So 在你项目中(不是子的)的init文件中需改给你的pymsql改个名。。
import pymysql
pymysql.install_as_MySQLdb()

设置连接mysql数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': "django_data", # 使用的库名
"USER": "root", # 用户名
"PASSWORD": "", # 数据库密码
"HOST": "localhsot", # 数据库主机地址
"PORT": "3306"
}
}
常用模型层字段:
CharField(max_length=None) :字符串字段
含有一个必须参数: max_length 设置最大的字符数长度限制;
IntegerField(**options) :一个整数,范围由 -2147483648 到 2147483647
DateField(auto_now=False, auto_now_add=False,**options) :以 datetime.date 实例表示的日期
含有两个可选参数: auto_now 、 auto_now_add
auto_now :该值为True时,每次在保存数据对象时,自动设置该字段为当前时间,也可以理解为自动更新最后一次修改时间
auto_now_add :该值为True时,该字段设置在第一次数据对象创建时,可以记录当前字段创建的时间值
注意: auto_now , auto_now_add , default 不能同时出现,一个字段属性只能有其中一条设置,当设置了 auto_now ,或 auto_now_add 时,也会让该字段默认具有 blank=True (字段可以为空)属性
DecimalField(max_digits=None,decimal_places=None, **options) :以Decimal实例标示的十进制浮点数类型
max_digits :位数总数,包括小数点后的位数,必须大于 decimal_places 参数
decimal_places :小数点后的数字数量,精度
FloatField(**options) :使用 float 实例来表示的浮点数
BooleanField(**options) :True/False字段,默认值为None
URLField(max_length=200, **options) : CharField 的子类,存储URL的字段
字段属性:
verbose_name(字段名称)
对于字段的一个可读性更高的名称,在后台可以更好的体现
Null
如果该值为True,Django将在数据库中将控制存储为NULL
字符串字段CharField与TextField要避免使用null,因为空值字符串将存储空字符串(""),而不是null值
对于字符串类型的数据字段,大多数情况下,django使用空字符串代表空值
blank
如果该值为True,则在验证时该字段值可以为空;
null为数据库存储层面可以为空,而blank为表单验证层面可以填写空值
db_column
数据库中用来表示该字段的名称,如果未指定,那么Django将会使用 Field 名作为字段名
db_index(加索引)
当该值为True时,为该字段创建索引
defau
该字段默认值,可以是一个值或是一个回调函数当是一个函数对象时,在创建新对象时,函数
editable(不允许被编辑)
如果设置该值为False,那么这个字段将不允许被编辑
不会出现在admin后台界面下,以及其他ModelForm表单中,同时也会跳过模型验证
primary_key(主键)
设置该值为 True 时,该字段成为模型的主键字段,一个模型类同时只能有一个主键
如果一个表中不存在任意一个设置好的主键字段,django会自动设置一个自增的 AutoField 字段来充当主键,该值可以用 pk , id 方式获取。主键的设置还意味着,null=False ,unique=True
Unique(唯一)
如果该值为True,代表这个数据在当前的表中有唯一值
这个字段还会在模型层验证存储的数据是否唯一
unique的设置也意味着当前字段具备索引的创建
ManyToManyField 、 OneToOneField 与 FileField 字段不可以使用该属性
模型元属性:
作用:在模型类的 Meta 类中,可以提供一系列的元选项,可以方便对该模型类进行属性设置或约束等
abstract(abstract = True)
代表当前模型类为抽象基类,不会创建真正的数据表,只是为了其他模型类继承使用
app_label(app_label = "MyApp")
当模型类被定义在了其他app下,这个属性用来描述当前表属于哪个app应用
db_table(设置表名称的)
当前模型类所对应的表名,未设置时,django默认将表名与app名由下划线组成,作为表名
需要注意这个表名为真实在数据库中所使用的,所以该元选项的使用应在数据表创建之前
如果在表已经存在的情况下去修改,会导致数据库内表与模型类表名不一致而查找不到报错
ordering(ordering = ['-birthday', 'age']#先按照birthday倒序排序,再按照age字段进行排序。)
当前表中的数据存储时的排序规则,这是一个字段名的字符串,可以是一个列表或元组;
每一个字符串前可以使用"-"来倒序排序,使用"?"随机排序
ordering排序规则的添加,也会增加数据库的开销
unique_together(unique_together = (('name','phone'),))
用来设置表中的不重复字段组合
格式为一个元组,元组中的每个数据都是一个元组,用来描述不重复的组合字段
如果只处理单一字段组合,可以是一个一维的元组
联合约束
verbose_name(,verbose_name="姓名"))
一般设置该表展示时所用的名称,名称被自动处理为复数,字符串后加一个"s"
verbose_name_plural(取消s的作用,让django人为已经是复数了,不用再加s)
与 verbose_name 功能相同,但是不会自动在字符串后加"s"以表复数
设置表的复数名称
进入django测试环境:
进入shell测试模式:
python manage.py shell
shell模式,可以在黑窗口进入python,执行增删改查。测试模块 把
django自带了一个数据库测试的shell工具
这是一个非常方便可以让我们对django代码进行测试的环境
save(数据提交)
实例save创建数据
查找对象:
all()(all_person = Person.objects.all())
获取一个表中的所有数据,返回 QuerySet 数据对象
filter(**kwargs)(res = Person.objects.all().filter(age__lt=1)
返回一个包含数据对象的集合,满足参数中所给的条件
exclude(**kwargs)(查找不符合条件的结果)
返回一个包含数据对象的集合,数据为不满足参数中所给的条件
get(**kwargs)(获取唯一单条数据,多或者少都会报错,解决办法,try:捕获异常)
get获取数据只会返回一条匹配的结果,获取的数据只能在数据库中有一条
order_by(*field)(Person.objects.all().order_by('-age'))
默认情况下,数据表使用模型类中的Meta中指定的ordering选项进行排序
现在也可以通过使用order_by函数进行查询结果的排序
count()(次数)
返回数据库中对应字段的个数,并且该函数永远不会引发异常
values(*fields)(models.Person.objects.all().values())
返回一个查询集结果,但是迭代访问时返回的是字典,而不是数据实例对象
链式过滤:
Exact(Person.objects.filter(account__exact='root'))
如果在查询过程中,没有提供查询类型(没有 双下划线 ),那么查询类型就会被默认指定为 exact ,这是一种严格查找的方式,用来在数据库中查找和查询时的关键词参数完全一致的内容
Iexact(Person.objects.filter(account__iexact='root'))
忽略大小写的匹配
startswith、endswith(Person.objects.filter(passwd__startswith='admin'))
分别匹配开头和结尾,区分大小写
istartswith、iendswith(Person.objects.filter(passwd__istartswith='admin'))
分别匹配开头和结尾,忽略大小写
Gte(Person.objects.filter(reg_data__gte=datetime.date.today))
大于或等于
Lte(Person.objects.filter(reg_data__lte=datetime.date.today))
小于或等于
修改:
1,重新赋值
2,update
删除:
delete
字段关系
字段关系是 django 维护表关系的方式;其中主要有一对一,多对一以及多对多,
现在的一对一及多对一关系中需要设置 on_delete 属性用来描述当关联数据被删除时的操作,有如下一些
models.CASCADE:删除关联数据,与之关联也删除
models.PROTECT:删除关联数据,引发错误ProtectedError
models.SET_NULL:与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT: 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
models.DO_NOTHING:删除关联数据,什么也不做
一对一关系:
一对一:一般用于某张表的补充,比如用户基本信息是一张表,但并非每一个用户都需要有登录的权限,不需要记录用户名和密码,此时,合理的做法就是新建一张记录登录信息的表,与用户信息进行一对一的关联,可以方便的从子表查询母表信息或反向查询
更接近于继承(成长)关系
如:人与伟人,老师与教授,男人与父亲,一人一个身份证,游戏账号对应游戏角色
teacher = models.OneToOneField(Teacher,primary_key=True,on_delete=models.CASCADE),连接表字段 = models.OneToOneField(所连接的表,on_delete=models.CASCADE)
多对一关系:
多对一:有很多的应用场景,比如每个员工归属于一个部门,那么就可以让员工表的部门字段与部门表进行一对多关联,可以查询到一个员工归属于哪个部门,也可反向查出某一部门有哪些员工
如:老师与学生,一个作者多本书,一个程序员多条程序,一个员工制作多件商品
teacher = models.ForeignKey(Headmaster,null=True,on_delete=models.SET_NULL),连接表字段 = models.ForeignKey(所连接的表,null=True数据库可以为空,on_delete=models.SET_NULL主表删除时子表不影响)
多对多关系:
多对多:如很多公司,一台服务器可能会有多种用途,归属于多个产品线当中,那么服务器与产品线之间就可以做成多对多,多对多在A表添加manytomany字段或者从B表添加,效果一致
SET_NULL与CASCADE的区别:
models.CASCADE一死皆死
models.SET.NULL,null=True,blank=True人死留一
使用时看业务逻辑
给表起表名:
Class Meta:
db_table=''
反向查询:
一对一不需要加set
多对多需要加set

猜你喜欢

转载自www.cnblogs.com/lhrd/p/10858929.html
今日推荐