Django的ORM

ORM(Object Relational Mapping)

    概念:

    对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法[2]  。O R M 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化[1]  。

 

ORM

  特殊的语法:一个简单的语法,翻译成sql语句

语法:

  1.数据操作库表  创建表,删除表,修改表

  2.操作数据库行  对于数据的增删改查

 

怎么连接数据库

  1.需要手动创建数据库,ORM不能创建数据库

 create database mysite charset=utf8; 

 

  2.手写一段代码,告诉django连接的是哪一个数据库,这里我们使用的是mysql数据库,sqlite3只用作测试使用

这一段代码是写在项目的settings.py中的

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   #ENGINE数据库引擎
        'NAME': "mysite",   #数据库的库名
        "USER":"root",  #登陆mysql的用户名
        "PASSWORD":"123456",    #登陆mysql的密码
        "HOST":"127.0.0.1",     #mysql数据库的IP
        "PORT":3306,    #端口
    }
}
这一段数据库的配置信息是写在项目的settings.py中的
这段代码是写在项目的_init_.py文件中的,是大项目的文件中,不能写在小项目的这个文件中

import pymysql  #调用pymysql
pymysql.install_as_MySQLdb()    #告诉django使用的数据库是mysql
这段代码是写在项目的_init_.py文件中的,告诉django用pymysql代替默认的MySQLdb

 

给django发布命令
1.python manage.py makemigrations        #相当于去你的models.py里面看一下有没有信息改动
2.python manage.py migrate  # 把改动翻译成sql语句,然后去数据库执行

 

 总结详细步骤:

  1.手动创建数据库

  2.创建django项目,并创建子项目app01

  

  3.在django项目的settings.py里面配置上数据库的相关信息

  4.在django项目里的_init_.py里面写上两行代码,告诉django用pymysql代替默认的MySQLdb

    import pymysql

    pymysql.install_as_MySQLdb()

  5.在子目录app01的models.py文件中写上类,执行第六步时会创建数据库的表,这里拿学生表和老师表为例

class Class(models.Model):
    id = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=32, null=True)
    first_day = models.DateField()

  


class Student(models.Model):
    id = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=32)
View Code
1、models.AutoField  自增列 = int(11)
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField  字符串字段
  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
5、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField  日期类型 datetime
  同DateField的参数
7、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
9、models.FloatField  浮点类型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、models.IPAddressField  字符串类型(ip4正则表达式)
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正则表达式
22、models.BinaryField  二进制
23、models.ImageField   图片
24、models.FilePathField 文件
补充 更多字段
1、null=True
  数据库中字段是否可以为空
2、blank=True
  django的 Admin 中添加数据时是否可允许空值
3、primary_key = False
  主键,对AutoField设置主键后,就会代替原来的自增 id 列
4、auto_now 和 auto_now_add
  auto_now   自动创建---无论添加或修改,都是当前操作的时间
  auto_now_add  自动创建---永远是创建时的时间
5、choices
GENDER_CHOICE = (
        (u'M', u'Male'),
        (u'F', u'Female'),
    )
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default  默认值
8、verbose_name  Admin中字段的显示名称
9、name|db_column  数据库中的字段名称
10、unique=True  不允许重复
11、db_index = True  数据库索引
12、editable=True  在Admin里是否可编辑
13、error_messages=None  错误提示
14、auto_created=False  自动创建
15、help_text  在Admin中提示帮助信息
16、validators=[]
17、upload-to
更多参数

  6.给django发布命令

    python manage.py makemigrations  #相当于去models.py里面看一下有没有信息改动

    python manage.py migrate   #把改动翻译成sql语句,然后去数据库执行

  7.在urls.py里面写上对应关系

from django.conf.urls import url
from django.contrib import admin
from  app01 import views
urlpatterns = [
    url(r'^student_user/',views.student_user),
    # url(r'^admin/', admin.site.urls),
]
View Code

 

  8.在子项目app01的views.py文件中写上视图函数

from django.shortcuts import render,HttpResponse,redirect
from . import models    #前面在models里面创建好了数据库的表

# Create your views here.
def student_user(request):
    # 查询出所有的user    #下面的objects是固定语法,必须要加上
    student_list=models.Student.objects.all()   #查询到的是一个由student对象组成的列表
        #<QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>, <Student: Student object>]>
    print(student_list)
    student0=models.Student.objects.first() #Student object 查询出来的是一个student对象中的第一个
    print(student0.sname)
    student2 = models.Student.objects.last()  #Student object  查询出来的是一个student对象中的最后一个
    print(student2.sname)
    student3=models.Student.objects.filter(sname="alex")    #<QuerySet [<Student: Student object>]>查询出来的是一个列表
    #若果有多个条件,就在第一个条件之后加上逗号,两个条件是and 也就是当两个条件同时成立时,查询所要查询的数据
    print(student3)
    # arg_dict={"sname":"alex"}
    # user4=models.Student.objects.filter(**arg_dict)    #把字典拆成关键字参数传进去,**arg_dict打散了传进去
    # print(user4[0].sname)   #alex  由于查到的结果是一个列表里面是对象,所以按照索引把对象取出来,再查看数据

    # # 为什么get用的比较少(get和filter都是查询)
    # user5=models.Student.objects.get(sname="sb")   #条件不满足时就报错
    # print(user5.sname)

    user6=models.Student.objects.filter(id=3)
    # 是可以用逻辑去判断的
    if len(user6)>0:
        print(user6[0].username)
    else:print("没有这个用户")    #打印结果为"没有这个用户"  原因是数据库中没有id为3的学生

    user7=models.Student.objects.exclude(sname="alex")  #这种方法不常使用,查询除了名字不是alex的学生,
    print(user7)    #<QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]>

    # 创建记录,
    # 第一种创建方式,生成数据并且提交到数据库
    # new_student=models.Student.objects.create(sname="yuan",cid=1)
    # print(new_student.sname,new_student.cid)
    # 第二种创建方式
    # 只创建了数据,但是没有向数据库提交
    # new_student2=models.Student(sname="张三",cid="4")
    # # 向数据库提交
    # new_student2.save()
    # print(new_student2) #Student object  创建的new_student2是一个对象 ,一个对象就是一行记录

    # 删除
    # 先查到要删除的数据
    models.Student.objects.filter(sname="yuan").delete()    #删除同时也提交

    # 改:第一种方式
    # 首先要知道改谁,然后再去改
    # models.Student.objects.filter(cid=4).update(sname="李四") #修改之后同时提交
    # 第二种方式
    # student10=models.Student.objects.filter(cid=1).first()
    # student10.sname="somebody"
    # # 提交一下
    # student10.save()    #如果不提交数据不会进入到数据库

    return render(request,"users.html",{"student_list":student_list})
    # return HttpResponse("OK")
View Code

 

 

出现上面截图中信息的原因是创建好的表结构中的字段默认是不能为空的.

 

models.py   -->django翻译成sql -->pymysql --->mysql        四部
1.通过建一个类(继承models.Model)    -->相当于创建了一个数据库中的表   ->类 --数据库
2.字段:
1.models.AutoField(primary_key=True) -->int 自增 主键
2.models.CharField(max_length=64,null=true) 默认是不能为空的,为空时设置null=true
3.models.IntegerField() # int类型

 

数据行的操作
            增:两种    User是models里面的类的名字,objects是语法要求,必须要写的
                1.models.User.objects.create(**{})#直接创建并且提交到数据库(在py文件中写这一行,在访问网页时,在经过路由系统执行对应的函数时,就把sql执行了,
                        并且也提交到了数据库)
                2.user=models.User(**{})    user.save() #创建后并没有立即被提交到数据库中,在执行到user.save之后,数据才被提交到数据库中
            删:找到对象删除
                models.User.objects.filter().delete()   #直接删除并且提交到数据库
            改: 更新 有两种方式
                1.models.User.objects.filter().update(更新的字段名称=更新的字段的值)
                2.user=models.User.objects.get(id=1)    user.username="张三"  user.save()  相当于给类中的某个属性重新赋值
            查:  models.User.objects.all()   查找所有的,查找结果返回的是由对象组成的列表
                 models.User.objects.get(条件)    根据条件查找,不满足条件就报错,返回的是一个对象
                 models.User.objects.filter(条件) 根据条件查找,不满足条件也不报错,但返回的结果是一个对象的列表
                 models.User.objects.filter().first()   取出由对象组成的列表中的第一个元素(也就是第一个对象)
                 models.User.objects.filter().last()    取出由对象组成的雷彪中的最后一个元素(也就是最后一个对象)
                 models.User.objects.exclude(条件)    查找不包含该条件的信息
行的增删改查

 

posted @ 2018-01-19 20:25  dwenwen  阅读(63)  评论(0)    收藏  举报