Django学习笔记--数据库中的单表操作----增删改查

1.Django数据库中的增删改查

1.添加表和字段

# 创建的表的名字为app的名称拼接类名
class User(models.Model):
    # id字段 自增 是主键
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    pwd  = models.CharField(max_length=32,null=True)
    
    #新增字段 设置为空或者指定默认值
    age = models.IntegerField(null=True)
    yy = models.CharField(default="你好")

    # 删除字段,直接注释掉对应的属性
    # 删除表,直接注释掉整个类即可

对表进行操作之后必须要执行数据库记录和同步数据库的操作

python3 manage.py makemigrations     数据库表变化记录
pythons manage.py migrate            数据库同步命令

2.插入数据

根据创建的模型,对其进行赋值

# 添加到数据库方式一 :通过对象保存
user = models.User(name=name,pwd=pwd)
user.save()

# 添加到数据库方式二 通过表模型固定的使用方式
user = models.User.objects.create(name=name,pwd=pwd)
# 返回值可以不用处理,直接调用这个方法,通过表名去创建对应的数据

3.为了方便对数据进行处理,在python脚本中调用Django环境

创建新的py文件
import os

# 构建模拟的django运行环境,在下面直接测试数据和修改对应的展示数据
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoDay02.settings")
    import django
    django.setup()

4.对数据操作,增删改查

# 查询对应的数据,filter过滤数据,查询结果是一个queryset对象,可以理解为一个列表对象
# first() 取出第一条数据
res = models.User.objects.filter(id=1)
print(res)
# 删除对象,delete()把查询出来的对象都删除,ret对象不用太关注,返回值是影响的数据的数量和对应的值
ret = models.User.objects.filter(name="你好").delete()

# 删除方式二,获取对象,对象调用删除方法
user =  models.User.objects.filter(id=2).first()
user.delete()

# 修改数据第一种方式
res = models.User.objects.filter(id=3).update(name="我就是我")
# 第二种方法
user = models.User.objects.filter(id=3).first()
user.name = "再次修改"
user.save() #保存数据

5.单表查询的其他操作

1.all() 查询所有结果

# 获取User表中的所有数据
users = models.User.objects.all()
print(users)

2.filter(**kwargs) 筛选指定条件的对象,对个条件可以同时查询,相当于一个and操作

user =  models.User.objects.filter(id=2)

3.get(**kwargs) 返回筛选的对象,返回结果之后一个,如果返回的结果超过一个或者一个都没有就会抛出异常,可以查看get的源码会抛出两个异常

 try:
     models.User.objects.get(name__contains='zhang')
 except models.User.DoesNotExist:
     print('值不存在')
 except models.User.MultipleObjectsReturned:
     print("不止一个值")
 else:
     print("有值成功")

4.exclude(**kwargs) 包含了所筛选条件不匹配的对象

# 把id不等于3的都传过来

user = models.User.objects.exclude(id=3)


5.order_by(*field)     对查询结果进行排序,默认根据id排序,输入要排序的字段名,反向排序在对应的字段前添加-

```python 
res = models.User.objects.filter(name__contains="你好").order_by('name')
res = models.User.objects.all().order_by('-name')

6.reverse() 对查询结果反向排序,必须在order_by之后才能使用reverse(),否则没有效果

users = models.User.objects.filter(name__contains="你好").reverse()

7.count() 返回查询的querySet对象的个数

users = models.User.objects.filter(name__contains="你好").count()

8.first() 返回第一条记录

user =  models.User.objects.filter(id=2).first()

9.last() 返回最后一条记录

user =  models.User.objects.filter(id=2).last()

10.exists() 如果querySet包含数据,就返回True,否则返回False

# 判断查询结果是否为空

res = models.User.objects.filter(id=30).exists()
print(res)


11.values(*field)      返回一个valueQuerySet对象一个特殊的QuerySet,运行后得到的是一个可迭代的字典序列,而不是一个model的实例化对象,可以传多个值进行取值操作

```python
#获取对应的values,取出对应的name字段对应的值,返回的是一个字典
ret = models.User.objects.all().values('name')
print(ret)
返回结果 <QuerySet [{'name': 'zhangsan'}, {'name': '我就是我'}, {'name': 'zhang1'}, {'name': 'zhang2'}, {'name': 'zhang3'}, {'name': 'zhang4'}, {'name': 'zhang5'}, {'name': 'zhang6'}, {'name': 'zhang7'}, {'name': 'zhang8'}, {'name': 'zhang9'}, {'name': '你好0'}, {'name': '你好2'}, {'name': '你好4'}, {'name': '你好6'}, {'name': '你好8'}, {'name': '你好10'}, {'name': '你好12'}, {'name': '你好14'}, {'name': '你好16'}, '...(remaining elements truncated)...']>

12.value_list(*field) 与values() 非常相似,返回的是一个元组序列,values返回的是一个字段序列,可以传多个值进行取值操作

# 获取对应的values,取出对应的name字段对应的值,返回的是一个元组
ret = models.User.objects.all().values_list('name')
print(ret)
返回结果 <QuerySet [('zhangsan',), ('我就是我',), ('zhang1',), ('zhang2',), ('zhang3',), ('zhang4',), ('zhang5',), ('zhang6',), ('zhang7',), ('zhang8',), ('zhang9',), ('你好0',), ('你好2',), ('你好4',), ('你好6',), ('你好8',), ('你好10',), ('你好12',), ('你好14',), ('你好16',), '...(remaining elements truncated)...']>

13.distinct() 从返回结果中删除重复数据

user =  models.User.objects.filter(name='zhangsan').distinct()

6.模糊查询

# 模糊查询,基于 __双下滑线模糊查询
# 查询在某个区间的值,查询id在1,2,3,4,5区间的所有值
ret = models.User.objects.filter(id__in=[1,2,3,4,5])
ret = models.User.objects.filter(id__range=[1, 200])
# id__in          在某个区间
# id__gt          大于某个值
# id__lt          小于某个值
# id__gte         大于等于
# id__lte         小于等于
# id__range       在某个范围
# id__contains    包含,
# id__icontains   忽略大小写
# id__startswith  以什么开始
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容