ORM简介:ORM是对象--关系--映射的简称,用来django与数据库的链接,django用ORM的语句来操作数据库。在应用的models.py文件中操作
from django.db import models
from datetime import datetime
class StudentsInFo(models.Model):
name=models.CharField(max_length=20,verbose_name='学生姓名')
age=models.IntegerField(default=18,verbose_name='学生年龄')
gender=models.CharField(choices=(('girl','女'),('boy','男')),max_length=6,default='girl',
verbose_name="学生性别")
stuid=models.CharField(max_length=20,verbose_name="学生学号")
address=models.TextField(verbose_name="学生地址")
height=models.DecimalField(max_digits=5,decimal_places=2)
image=models.ImageField(upload_to='user/%y/%m/%d',max_length=20,verbose_name='学生头像')
add_time=models.DateTimeField(default=datetime.now,verbose_name='添加时间')
is_delete = models.BooleanField(default=False,verbose_name='是否删除')
#有更改自动执行(返回的是字符串)
def __str__(self):如果是python2.7则为__unicode__(self)
return self.name
#原设置
class Meta:
#重命名设置表在数据库里的名字。
#db_table = ''
#设置默认以某一字段进行排序,-age为倒序
ordering=['age']
#设置表名在admin后台显示的名字,下面是复数形式也用这个名字
verbose_name='学生信息'
verbose_name_plural=verbose_name
class Meta:
#重命名设置表在数据库里的名字。
#db_table = ''
#设置默认以某一字段进行排序,-age为倒序
ordering=['age']
#设置表名在admin后台显示的名字,下面是复数形式也用这个名字
verbose_name='学生信息'
verbose_name_plural=verbose_name
表名为:app名字_StudentsInFo的小写形式
类型:AutoField 自动增长字段 CharField字符串(指定最大长度) IntegerField整型(有默认值) TextField文本(不让用指定长度) DecimalField浮点数(可以设置小数位数max_digits最大数字长度 decimal_places小数位数 ) ImageField图片文件(upload_to='user/%y/%m/%d'用时间储存) DateTimeField设置时间 BooleanField布尔值字段
别名在后台显示:verbose_name 默认值:default 最大长度:max_length ordering排序
choices=(('girl','女'),('boy','男'))默认可选项
生成迁移文件命令:python3 manage.py makemigrations
执行sql语句生成数据表命令:python3 manage.py migrate
创建一个管理员用户命令:python3 manage.py createsuperuser#按提示输入用户名、邮箱(可以忽略)、密码。在admin.py操作先从app中的model中导入StudentsInFo类。zai把学生类推到后台管理admin.site.register(StudentsInFo)
增加数据方法:
方法一:要先实例化对象,然后用类与对象的方法添加内容然后用a.save()提交到数据库
方法二:类名.objects.create(name='lm',…..)
查数据:(前面可以不赋值)
方法一:stus=类名.objects.all()每一个对象返回一个列表
方法二:条件查找返回列表stu=类名.objects.filter(age=30) filter 过滤查找,找不到为空列表.。多条件stu=类名.objects.filter(name='zhaoliying',age=30)
方法三:get(少用)获取一个数据对象stu=类名.objects.get(age=30)只找到一个,返会一个对象,没有或者多个会报错
改数据:
方法一:对象方法,先查数据在改数据stu=类名.objects.filter(age=30)[0] stu为一个对象而不是列表然后同对象属性改stu.age='31'。然后a.save()提交到数据库
方法二:update(针对列表)类名.objects.filter(name='zhaoliying').update(age=18)
删除数据:
方法一:对象方法先找数据在删除 stu=类名.objects.filter(age=30)[0] stu.delete()
方法二:列表直接删除(可删除多个)类名.objects.filter(age=30).delete()
表的内容为空时要null=True(数据库识别)并且blank=True(django识别)
table表格 tr是行td是列 th是表头 forloop.counter表格序号
redirect重定向 返回的是一个请求在django.shortcuts 导入。
还要django.core.urlresolvers在django.导入reverce('软连接')来反向解析
return redirect(reverse('students:students_list'))
更改学生信息时要通过请求方式传递参数id 通过对象.objects.filter(id=int(stu_id))updata(name=uanme)更改,或stu=对象.objects.filter(id=int(stu_id))[0] stu.name=a
多对多转化为一对多
一对一原表为父表或主表,对原表补充的叫子表或次表。
通过字段student=models.OneToOneField(StudentsInfo,verbose_name='所属学生')在次表数据库里就自动添加student_id来建立关系。关系建立在子表或再一对多的多的对象里
一对一关系表的增删改查
1、多表增加数据时要先增加主表数据再增加子表数据然后让子表数据与主表数据关联
创建主表对象在创建子表对象然后再建立联系stu.student_id=student.id
2、多表查找知道主表的数据对象,要去找子表的数据对象
子表对象=主表对象.子表类名小写
知道子表的数据对象,要去找主表的数据对象
主表对象=子表对象.关系字段
3、多表更改数据先后先后顺序可以更改。注意修改时两个表的id和关系字段不会发生改变但是要记住save()
4、多表删除数据时要先删除子表数据再删除主表数据
一对多关系表的增删改查
多表查找知道主表的数据对象,要去找子表的数据对象(返回的是一个列表)
子表对象列表=主表对象.子表类名小写_set(所有对象)
知道子表的数据对象,要去找主表的数据对象
主表对象=子表对象.关系对象
其他同一对一
{% if student.banclass == ban.id %}selecred{% endif %}
关系建立在子表或再一对多的多的对象里
子表或再一对多的多的对象里找上级关系用student.banclass_id=ban.id
数据的逆向传输的,继承时继承静态样式,不能继承,子类不能用父级的数据,父级可以看到子类的数据
多对多的表数据的查找,关系字段所在的表为子表,子表找主表用对象名.关系字段.查找方法。主表找子表用对象名.子表类名小写_set.查找方法
一个多对多的案例:
例子:一个作者对应多本书,一本书有多个作者
model代码:
1.class Author(models.Model):
2. first_name = models.CharField(max_length=30)
3. last_name = models.CharField(max_length=40)
4. email = models.EmailField()
5.
6.class Book(models.Model):
7. title = models.CharField(max_length=200)
8. authors = models.ManyToManyField(Author)
(一)获取对象方法:
1.从书籍出发获取作者
1.b = Book.objects.get(id=50)
2.b.authors.all()
3.b.authors.filter(first_name='Adam')
2.从作者出发获取书籍
1.a = Author.objects.get(id=1)
2.a.book_set.all()
(二)添加对象方法:
1.a = Author.objects.get(id=1)
2.b = Book.objects.get(id=50)
3.b.authors.add(a)
(三)删除对象对象方法:
1.a = Author.objects.get(id=1)
2.b = Book.objects.get(id=50)
3.b.authors.remove(a) 或者 b.authors.filter(id=1).delete()