Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)

文章目录

  • 一orm操作
    • 1.orm类模型的字段属性(暂总结)
    • 2.orm类模型的字段类型(暂总结)
    • 3.元数据(写在class Meta表中的数据)
    • 4.ORM的操作(单表操作;增删改查)
  • 二、输出的Queryset含义及何时出现,特性,何种方法可返回对象
    • 1.含义:
    • 2.使用何种方法的时候返回
    • 3.特性
    • 4.使用何种方法返回对象
    • 三、关系搭建之 一对多(orm一对多操作)
    • 1.增加
    • 2.查询
    • 3.更新
    • 4.删除

一orm操作


1.orm类模型的字段属性(暂总结)


字段属性 含义
max_length 最大长度
verbose_name 备注,站点管理中用于显示字段为中文
max_digits 浮点型最大长度
decimal_places 小数点位数
auto_now = True 获取的是当前时间
null = True 可为空,默认是不为空
primary_key=True 主键

2.orm类模型的字段类型(暂总结)


字段类型 含义
CharField varchar类型,需要指定长度
IntegerField 整形
DecimalField 浮点型 需要指定最大长度和小数点位数
DateField 日期
datetime 日期时间
AutoField 自增
ForeignKey 做外键

字段名和字段用法的一些举例:

 # id = models.AutoField(primary_key=True)
    # django ORM会自动帮我们创建一个主键
    name = models.CharField(max_length=32,verbose_name="姓名")
    age = models.IntegerField(verbose_name="年龄")
    height = models.DecimalField(max_digits=5,decimal_places=2,verbose_name="身高",null=True)
    birthday = models.DateField(verbose_name="生日",auto_now=True)
    
    publish = models.ForeignKey(to=Publish,to_field='id',on_delete=models.CASCADE)

外键括号里面一般写的内容

相关内容 含义
to 设置关联表
to_field 关联表要关联的键名,默认为关联表中的id,可以不写
on_delete 当删除关联表中的数据的时候,从表做什么行为,

on_delete 后面一般接的方法:

方法 作用
CASCADE 当关联表中数据删除的时候,外键所在表中的数据也会被删除
SET_NULL 当关联表中数据删除的时候,外键所在表中的外键设置为空
SET_DEFAULT(1) 当关联表中数据删除的时候,外键所在表中的外键设置一个默认值,默认值为1
PROTECT 关联保护,当关联表的数据被删除的时候,报异常,
DO_NOTHING 当关联表中数据删除的时候,外键所在的表不做任何事情

3.元数据(写在class Meta表中的数据)


元数据 含义
db_table 修改表的名字(原表中修改名字显示格式为appname_类名,而元数据修改后名字即为修改后的名字)
verbose_name 备注,站点管理中用于显示模型名字为中文,会出现s
verbose_name_plural 显示复数名称,verbose_name_plural=‘用户’ 可以直接将用户好后面的s去掉
ordering= [’-age’] 指定排序

相关代码如下:

	class Meta:
 		db_table = 'person'
        verbose_name = "用户"
        verbose_name_plural = verbose_name
        # ordering= ['-age','id','name']  #指定以年龄降序,id升序,名字升序排序

4.ORM的操作(单表操作;增删改查)


单表操作之前的基础构造


在操作之前,先创建好类模型,并进行数据迁移;
Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第1张图片
Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第2张图片
写好视图和路由;
Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第3张图片


① 增加


  • save 方法
    Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第4张图片
  • create方法
    Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第5张图片

② 查询


1. all()


  • 返回一个 queryset 一个列表
  • 返回符合条件的所有数据
  •     # all 方法
        date = Person.objects.all()
        # print (date)
        # print (date[0].name)
        # print (date[0].age)
        # print (date[0].height)
        for one in date:
            print (one.height)
            print (one.name)
    
    Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第6张图片
    可以通过遍历取得数据

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第7张图片


2.get方法


  • 返回是一个 对象

  • 返回结果有且只有一条,get后面的条件常用主键

      # get 方法
      data = Person.objects.get(id=1)
      print (data.name)
      print (data.age)  
    

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第8张图片


3.filter 方法,类似于sql中的 where


  • 返回值: queryset
  • 使用遍历或者下标提取属性的值
  •     # filter 方法
        data = Person.objects.filter(name="zhangsan")
        print (data)
    

first方法 和last 方法

first 返回一个对象,返回符合条件的第一条数据(对象)

last 返回一个对象,返回符合条件的最后一条数据(对象)

    data = Person.objects.filter(name="zhangsan").first()
    print (data.age)

    data = Person.objects.filter(name="zhangsan").last()
    print(data.age)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第9张图片


4.order by


    # 升序
    # data = Person.objects.all().order_by("age")
    # 降序
    data = Person.objects.all().order_by("-age")
    for one in data:
        print (one.age)
    data = Person.objects.all().order_by("age","-name")

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第10张图片


5.exclude()


返回一个quertset,查询集,包含了跟给定条件不符合的所有数据

    data = Person.objects.exclude(name="zhangsan")
    for one in data:
        print (one.name)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第11张图片


6.一些用在条件后的方法


values 返回的是一个queryset 内容不是实例对象,而是具体数据的字典

    # values   queryset [对象,对象,对象]
    # 返回的是一个queryset 内容不是实例对象,而是具体数据的字典
    # data = Person.objects.filter(name="zhangsan").values()
    # print (data)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第12张图片
count 返回的是符合当前条件的数据的条数

    # count 返回的是符合当前条件的数据的条数
    # data = Person.objects.filter(name="zhangsan").count()
    # print (data)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第13张图片
exists 返回一个 True或者Flase 判断是否存在

    # data = Person.objects.filter(name="libai").exists()
    # print (data)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第14张图片
切片 通过排序来去范围内的数,[2:5] 2是索引,查出来的是第三个开始第五个结束

    data = Person.objects.order_by("id")[2:5]
    print (data)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第15张图片


③ 修改


save
注意:拿到的结果是对象还是查询集合

步骤:
先查询到数据,然后进行重新赋值,然后执行save 进行保存

    # data = Person.objects.get(id=2)
    # data.name = "python"
    # data.save()

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第16张图片

    # data = Person.objects.filter(name="wangwu").all()
    # for one in data:
    #     if one.id == 4:
    #         one.age=21
    #     else:
    #         one.age = 23
    #     one.save()

update

    Person.objects.filter(id=2).update(name="java")

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第17张图片


④ 删除


    # delete方法
    Person.objects.filter(id=7).delete()

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第18张图片


⑤ 双下划线查询


    # __lt 小于
    # data = Person.objects.filter(id__lt=3)
    # print (data)
    # gt  大于
    # data = Person.objects.filter(id__gt=3)
    # print (data)
    # gte 大于等于
    # data = Person.objects.filter(id__gte=3)
    # print (data)
    # in 包含  select * from stu where id in (1,2,3,4);
    # data = Person.objects.filter(id__in = [1,2,3])
    # print (data)
    # exclude 不包含
    # range 范围
    # data = Person.objects.filter(id__range = [1,5])
    # print (data)
    #  startswith   像 like j%   endswith  像 %j
    # data = Person.objects.filter(name__startswith="j")
    # print (data)
    #  endswith
    #  __contains 包含  大小写敏感
    data = Person.objects.filter(name__contains="w")
    print (data)
    #   __icontains  包含,大小写不敏感
    data = Person.objects.filter(name__icontains="w")
    print(data)
双下划线方法 含义
__lt 小于
__gt 大于
__gte 大于等于
__in 包含
__exclude 不包含
__range 范围
__startswith 像 like j% 以什么开头
__endswith 像 %j 以什么结束
__contains 包含 大小写敏感 区分大小写
__icontains 包含,大小写不敏感 不区分大小写

二、输出的Queryset含义及何时出现,特性,何种方法可返回对象


1.含义:


查询集,不是python列表,也叫结果集,表示从数据库中获取的一个对象集合


2.使用何种方法的时候返回


  • all()
  • filter()
  • order_by()
  • exclude()
  • values 特殊的queryset
  • 切片

3.特性


  • 惰性
    • 创建好查询集之后不会立即执行,在使用的时候才会进行数据的查询,
  • 缓存
    • 使用一个查询集,第一次使用进行查询,然后将数据进行缓存,之后再使用该查询集不会再次发起查询,而是将查询到的结果缓存了下来

4.使用何种方法返回对象


  • get
  • first()
  • last()

三、关系搭建之 一对多(orm一对多操作)


Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第19张图片
创建好类模型并数据迁移
Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第20张图片


1.增加


增加出版社

    Publish.objects.create(name='清华出版社',address='北京')
    publish = Publish(name='中国出版社',address='北京朝阳')
    publish.save()
    publish=Publish()
    publish.name='河南出版社'
    publish.address='河南'
    publish.save()

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第21张图片
增加书 第一种方法

Book.objects.create(name=‘python入门’,publish_id=‘1’)

publish=Publish.objects.get(name='中国出版社')
Book.objects.create(name='python基础',publish_id=publish.id)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第22张图片
第二种方法

# Book.objects.create(name='python核心编程',publish = Publish.objects.get(name='中国出版社'))

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第23张图片
第三种方法

# 正向操作    从外键所在的表到主表叫正向
book = Book()
book.name= '笨办法学python'
book.publish = Publish.objects.get(name='河南出版社')
book.save()
# 反向操作  从主表到从表 叫反向
publish_obj = Publish.objects.get(name="中国出版社")
publish_obj.book_set.create(name='pythonWeb开发')

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第24张图片

正向操作和反向操作:

正向操作 从外键所在的表到主表叫正向

反向操作 从主表到从表 叫反向


2.查询


查询的第一种方法

# publish = Publish.objects.get(name="中国出版社")
# book = Book.objects.filter(publish_id=publish.id).all()
# for x in book:
#     print (x.name)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第25张图片
查询第二种方法

# 正向查询  从外键所在的表到主表叫正向
# 查询  pythonWeb开发 属于哪一个出版社
# book = Book.objects.filter(name='pythonWeb开发').first()
# print (book.name)
# print (book.publish.name)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第26张图片
Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第27张图片
查询第三种方法

# 反向查询 从主表到从表  叫 反向查询     _set
publish = Publish.objects.get(name='中国出版社')
book = publish.book_set.all()
print (book)

Django中 ORM操作(orm类模型的字段属性和字段类型,元数据)orm单表操作(增删改查,双下划线查询)一对多(增删改查)_第28张图片


3.更新


① save

 book = Book.objects.filter(name='python入门',id=2).first()
    book=Book.objects.get(id=2)
    book.publish=Publish.objects.get(name='中国出版社')
    book.save()

② update

Book.objects.filter(name="python基础",id=3).update(publish_id=Publish.objects.get(name='河南出版社'))

③ set 反向

 publish=Publish.objects.get(name='河南出版社')
    book=Book.objects.get(id=6)
    publish.book_set.set([book])

4.删除


先删除外键所在的表,在删除关联表

Book.objects.get(id=2).delete()
Publish.objects.get(name='清华出版社').delete()

你可能感兴趣的:(#,python,web开发)