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

一orm操作


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


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

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


字段类型含义
CharFieldvarchar类型,需要指定长度
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的操作(单表操作;增删改查)


单表操作之前的基础构造


在操作之前,先创建好类模型,并进行数据迁移;
在这里插入图片描述
在这里插入图片描述
写好视图和路由;
在这里插入图片描述


① 增加


  • save 方法
    在这里插入图片描述
  • create方法
    在这里插入图片描述

② 查询


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)
    
    在这里插入图片描述
    可以通过遍历取得数据

在这里插入图片描述


2.get方法


  • 返回是一个 对象

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

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

在这里插入图片描述


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)

在这里插入图片描述


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")

在这里插入图片描述


5.exclude()


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

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

在这里插入图片描述


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


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

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

在这里插入图片描述
count 返回的是符合当前条件的数据的条数

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

在这里插入图片描述
exists 返回一个 True或者Flase 判断是否存在

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

在这里插入图片描述
切片 通过排序来去范围内的数,[2:5] 2是索引,查出来的是第三个开始第五个结束

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

在这里插入图片描述


③ 修改


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

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

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

在这里插入图片描述

    # 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")

在这里插入图片描述


④ 删除


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

在这里插入图片描述


⑤ 双下划线查询


    # __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一对多操作)


在这里插入图片描述
创建好类模型并数据迁移
在这里插入图片描述


1.增加


增加出版社

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

在这里插入图片描述
增加书 第一种方法

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

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

在这里插入图片描述
第二种方法

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

在这里插入图片描述
第三种方法

# 正向操作    从外键所在的表到主表叫正向
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开发')

在这里插入图片描述

正向操作和反向操作:

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

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


2.查询


查询的第一种方法

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

在这里插入图片描述
查询第二种方法

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

在这里插入图片描述
在这里插入图片描述
查询第三种方法

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

在这里插入图片描述


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()

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值