Django的orm一

1.创建表

1.1 创建普通表

class UserType(models.Model):
'''
用户类型
'''
title=models.CharField(max_length=16)

1.2 创建外键依赖

class UserInfo(models.Model):
'''
用户表
'''
username=models.CharField(max_length=16)
age=models.IntegerField()
ut=models.ForeignKey('UserType',on_delete=models.CASCADE)

不指定主键的类,在执行命令的时候会直接同步出一列id字段;

1.3 修改表

  • 增加表,直接添加类
  • 注意此时,数据库中若是有数据需要允许为空(或者设置默认值defualt)
class Foo(models.Model):
name=models.CharField(max_length=16) class UserType(models.Model):
'''
用户类型
'''
title=models.CharField(max_length=16)
uf=models.ForeignKey(to='Foo',on_delete=models.CASCADE)

1.4 常用字段

# 字符串
models.CharFiled(max_length=?)
# 整数型
models.IntegerField()
# 布尔值字段
models.BooleanField(verbose_name='别名每个类型都可以有', default=False)#默认值
# 时间类型
models.DateTimeField(verbose_name='创建时间', auto_now_add=True)#设置自动添加
# 大整数
models.BigIntegerField()
# 正整数
models.PositiveIntegerField(verbose_name='价格')
# 小数值-存储的一般是0-9的单个值,代表对应的值
models.SmallIntegerField()
# 外键
models.ForeignKey(to="表",on_delete=models.CASCADE)
 category_choices = (
(1, '免费版'),
(2, '收费版'),
(3, '其他'),
)
category = models.SmallIntegerField(verbose_name='收费类型', default=2, choices=category_choices)
models.DateTimeField(verbose_name='开始时间', null=True, blank=True)
  • blank

    设置为True时,字段可以为空。设置为False时,字段是必须填写的。字符型字段CharField和TextField是用空字符串来存储空值的。如果为True,字段允许为空,默认不允许。

  • null

    设置为True时,django用Null来存储空值。日期型、时间型和数字型字段不接受空字符串。所以设置IntegerField,DateTimeField型字段可以为空时,需要将blank,null均设为True

2. 执行命令

# 1.生成记录的名称
python manage.py makemigrations # 2.生成到数据库中的命令
python manage.py migration

生成的记录文件在对应的APP的migrations文件夹下;

3.插入数据

# 插入数据
models.UserType.objects.create(title="1")
models.UserType.objects.create(title="2")
models.UserType.objects.create(title="3")
models.UserInfo.objects.create(username="逻辑",age="30",ut_id="1")#数据库中的外键,为ut_id
models.UserInfo.objects.create(username="程心",age="35",ut_id="1")
models.UserInfo.objects.create(username="艾AA",age="27",ut_id="2")
models.UserInfo.objects.create(username="曼努尔·雷迪亚兹",age="30",ut_id="3")

4.简单查询

4.1 查询所有

res=models.UserInfo.objects.all()
print(res)

返回的是对象类型QuerySet(类似列表),包含很多对象,一个对象就是一行数据;

  • 循环显示

  • res=models.UserInfo.objects.all()
    print(res)
    for row in res:
    print(row.id,row.username)

4.2 条件查询

res_list=models.UserInfo.objects.filter(id=1,username="逻辑")#默认是and连接的
print(res_list[0].username)

4.3 简单介绍双下划线

  • gt大于;lt小于
  • res_list=models.UserInfo.objects.filter(id__gt=2)#查找id大于2的
    res_list1=models.UserInfo.objects.filter(id__lt=2)#查找id小于2的

5.删除数据

  • models.UserInfo.objects.filter(id=4).delete()

6.更改数据

models.UserInfo.objects.filter(id=3).update(age=18)

8.连表查询

8.1 正向操作

  • 包含外键字段的表,直接使用表可以找出关联表的对应数据行(一条);
reslist=models.UserInfo.objects.all()
for res in reslist:
print(res.username,res.age,res.ut_id,res.ut)#两张表连接
# print(res.ut)#对象,代表usertype中的一行数据
# print(res.ut.title)
# print(res.ut.uf)#uf的对象
# print(res.ut.uf_id)#uf的对象
# print(res.ut.uf.name)#uf的对象,连接到第三张表
return HttpResponse("Hello world")

8.2反向操作

  • 被关联的表,不包含外键的字段;但是可以使用,表名小写_set,取出对应的值与数据(多条);
obj=models.UserType.objects.all().first()#取得第一条数据
print(obj.title,obj.userinfo_set)
for row in obj.userinfo_set.all():
print(row.username,row.age)
# 待条件的反向操作
reslist=models.UserType.objects.all()
for item in reslist:
print(item.title,item.userinfo_set.filter(username="逻辑"))

9.返回值

9.1 Values

  • 返回的QuerySet内部是字典类型;
res=models.UserInfo.objects.all().values('id','username')
# res依旧是queryset但是内部是字典类型
print(res)
for item in res:
print(item)

9.2 Values_list

  • 返回的QuerySet内部类型是元组
res_list=models.UserInfo.objects.all().values_list('id','username')
# 取出的依旧是两列,内部是列表类型
for res in res_list:
print(res)

9.3返回值总结

  • 返回对象
    models.Userinfo.objects.all()
    models.Userinfo.objects.filter(id__gt=1)# id>1

    返回的对象可以使用.进行操作

  • 返回字典
    models.Userinfo.objects.all().values('id','username')# 填入对应的值
  • 返回元组
    models.Userinfo.objects.all().values_list('id','username')# 填入对应的值

  • 注意:字典和元组不能像对象一样进行跨表因此跨表的时候需要在传入对应的参数,使用双下划线

    # 跨表字段使用双下滑线进行操作;元组中也是这样;
    res=models.UserInfo.objects.all().values('id','username','ut__title')
    # res依旧是queryset但是内部是字典类型
    print(res)
    for item in res:
    print(item)

继续努力,终成大器;

Django的orm(一)的更多相关文章

  1. python——Django(ORM连表操作)

    千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...

  2. Python’s SQLAlchemy vs Other ORMs[转发 3]Django's ORM

    Django's ORM Django is a free and open source web application framework whose ORM is built tightly i ...

  3. 将SALT_STACK的JOB-CACHE放到数据库中,而建库用DJANGO的ORM完成

    下面包括了SALT_MASTER的配置,及DJANGO的ORM里更改默认表名称,更改默认字段名称(里面有个RETURN),更改默认ID索引... 一个下午有和它磨来磨去... 感谢鹏龙,感谢高远..: ...

  4. Django:之ORM、CMS和二维码生成

    Django ORM Django 的数据库接口非常好用,我们甚至不需要知道SQL语句如何书写,就可以轻松地查询,创建一些内容,所以有时候想,在其它的地方使用Django的 ORM呢?它有这么丰富的 ...

  5. Django的ORM实现数据库事务操作

    在Django中实现数据库的事务操作 在学习MySQL数据库时,MySQL数据库是支持原子操作的. 什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费. 交易正常时,银行在消费者 ...

  6. 第十九章 Django的ORM映射机制

    第十九章 Django的ORM映射机制 第一课 Django获取多个数据以及文件上传 1.获取多选的结果(checkbox,select/option)时: req.POST.getlist('fav ...

  7. Django之ORM基础

    ORM简介 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  8. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  9. ORM以及Django使用ORM创建表

    day61 2018-04-28 1. 内容回顾 1. HTTP协议消息的格式: 1. 请求(request) 请求方法 路径 HTTP/1.1\r\n k1:v1\r\n ...\r\n \r\n ...

  10. django的ORM

    在项目根目录下运行 python manage.py shell 即可进入django的交互shell界面 查询 from my_app.models import MyTestModel datas ...

随机推荐

  1. java解洛谷P1003铺地毯问题

    此题给出的最大地毯数量为10000,创建[10001][4]长度的二维数组 以稀松数组的方法,[第i个地毯]的 [0][1][2][3]分别保存地毯的坐标和大小 再用需要求的坐标比较即可 public ...

  2. mongodb在插入数据环节避免数据重复的方法(爬虫中的使用update)

    mongo 去重 import pymongo client = pymongo.MongoClient() collection=client.t.test # collection.insert( ...

  3. scanf用法及scanf中有\n的问题

    scanf()函数的原理 想象输入设备(键盘)连接着一个叫"缓冲"的东西,把缓冲认为是一个字符数组. 当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住 ...

  4. UIKit绘图演练

    一般使用UIKit给我们提供的绘图来绘制一些文字,图片这些东西.     UIKit给我们提供画图的方法底层也是分为四步.所以也必须在drawRect方法当中去写.     1.如何画文字?      ...

  5. 键盘弹起及lab时的动态计算高度 --董鑫

    1.键盘抬起或掉下时,动态计算高度 2.动态计算Label的高度 计算的高度时,numberOfLines必须设置为0: 2.1  ios7.0之后 2.2 iOS 7.0之前

  6. HashMap 的 7 种遍历方式与性能分析

    前言 随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从 ...

  7. Spring Boot 2.x基础教程:使用tinylog记录日志

    tinylog简介 tinylog,与其他各种tiny开头的东西一样,是一个轻量级的开源日志解决方案.它本身只包含两个JAR文件(一个用于API,另一个用于实现),没有任何外部依赖关系.两个JAR文件 ...

  8. MySQL时间格式TIMESTAMP和DATETIME的区别

    时区,timestamp会跟随设置的时区变化而变化,而datetime保存的是绝对值不会变化 自动更新,insert.update数据时,可以设置timestamp列自动以当前时间(CURRENT_T ...

  9. c语言数据结构,你可能还不知道的顺序表

    数据结构顺序表 顺序表定义 1,前言 线性表的顺序存储又称为顺序表.它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻.其最大的特点就是:元素的逻辑 ...

  10. 基于TMS320C6670的软件无线电核心板

    一.板卡概述 北京太速科技自主研发的TMS320C6670核心板,采用TI KeyStone系列的四核定点/浮点DSP TMS320C6670作主处理器.板卡引出处理器的全部信号引脚,便于客户二次开发 ...