博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Django中models模块增删改查

Posted on 2023-04-10 14:23  心默默言  阅读(76)  评论(0编辑  收藏  举报

1.创建表和字段

from django.db import models


class Blog_Model(models.Model):
    name = models.CharField(db_column='name', max_length=200, blank=True, verbose_name='name')

   num = models.IntegerField(db_column='num', blank=True, verbose_name='num')

   class Meta: db_table = 'Blog' # db_table--重写数据表名称
  1. 注:在类里面不指定主键字段,django会帮您自动创建一个id主键!
  2. 默认情况下,Django 会根据模型类的名称和包含它的应用的名称自动指定数据库表名称。eg:blog_type(blog:APP名称,type:模型类名称)
  3. 使用 Meta类中的 db_table 参数来重写数据表的名称

 

增删改查
 

2.查

In [1]:
from main_test.db_manager.models import Blog_Model
Blog_Model.objects.all().values()
Out[1]:
<QuerySet [{'id': 1, 'name': 'ww', 'num': 1}, {'id': 3, 'name': 'rr', 'num': 1}, {'id': 4, 'name': 'jj', 'num': 1}, {'id': 5, 'name': 'rr', 'num': 1}, {'id': 6, 'name': 'bb', 'num': 1}, {'id': 7, 'name': 'bb', 'num': 1}, {'id': 8, 'name': 'nn', 'num': 1}, {'id': 9, 'name': 'yy', 'num': 1}, {'id': 10, 'name': 'yy', 'num': 2}, {'id': 11, 'name': 'yy', 'num': 2}, {'id': 12, 'name': 'zz', 'num': 4}, {'id': 13, 'name': 'aa', 'num': 3}]>
In [2]:
Blog_Model.objects.all().values('id')
Out[2]:
<QuerySet [{'id': 1}, {'id': 3}, {'id': 4}, {'id': 5}, {'id': 6}, {'id': 7}, {'id': 8}, {'id': 9}, {'id': 10}, {'id': 11}, {'id': 12}, {'id': 13}]>
In [3]:
Blog_Model.objects.all().values_list('name','num')
Out[3]:
<QuerySet [('ww', 1), ('rr', 1), ('jj', 1), ('rr', 1), ('bb', 1), ('bb', 1), ('nn', 1), ('yy', 1), ('yy', 2), ('yy', 2), ('zz', 4), ('aa', 3)]>
In [4]:
Blog_Model.objects.get(id=1).num
Out[4]:
1
In [6]:
Blog_Model.objects.filter(id__lt=3).values() # less then
Out[6]:
<QuerySet [{'id': 1, 'name': 'ww', 'num': 1}]>
In [7]:
Blog_Model.objects.filter(id__gt=3).values() #  greater then
Out[7]:
<QuerySet [{'id': 4, 'name': 'jj', 'num': 1}, {'id': 5, 'name': 'rr', 'num': 1}, {'id': 6, 'name': 'bb', 'num': 1}, {'id': 7, 'name': 'bb', 'num': 1}, {'id': 8, 'name': 'nn', 'num': 1}, {'id': 9, 'name': 'yy', 'num': 1}, {'id': 10, 'name': 'yy', 'num': 2}, {'id': 11, 'name': 'yy', 'num': 2}, {'id': 12, 'name': 'zz', 'num': 4}, {'id': 13, 'name': 'aa', 'num': 3}]>
In [8]:
Blog_Model.objects.filter(id__gt=3,id__lt=6).values()
Out[8]:
<QuerySet [{'id': 4, 'name': 'jj', 'num': 1}, {'id': 5, 'name': 'rr', 'num': 1}]>
In [10]:
Blog_Model.objects.filter(id__in=[3,4,5]).values()
Out[10]:
<QuerySet [{'id': 3, 'name': 'rr', 'num': 1}, {'id': 4, 'name': 'jj', 'num': 1}, {'id': 5, 'name': 'rr', 'num': 1}]>
In [11]:
Blog_Model.objects.exclude(id__in=[3,4,5]).values()
Out[11]:
<QuerySet [{'id': 1, 'name': 'ww', 'num': 1}, {'id': 6, 'name': 'bb', 'num': 1}, {'id': 7, 'name': 'bb', 'num': 1}, {'id': 8, 'name': 'nn', 'num': 1}, {'id': 9, 'name': 'yy', 'num': 1}, {'id': 10, 'name': 'yy', 'num': 2}, {'id': 11, 'name': 'yy', 'num': 2}, {'id': 12, 'name': 'zz', 'num': 4}, {'id': 13, 'name': 'aa', 'num': 3}]>
In [13]:
Blog_Model.objects.filter(id__range=[1, 5]).values()   # 范围 bettwen and
Out[13]:
<QuerySet [{'id': 1, 'name': 'ww', 'num': 1}, {'id': 3, 'name': 'rr', 'num': 1}, {'id': 4, 'name': 'jj', 'num': 1}, {'id': 5, 'name': 'rr', 'num': 1}]>
In [15]:
Blog_Model.objects.filter(name='yy').order_by('id').values()
Out[15]:
<QuerySet [{'id': 9, 'name': 'yy', 'num': 1}, {'id': 10, 'name': 'yy', 'num': 2}, {'id': 11, 'name': 'yy', 'num': 2}]>
In [16]:
Blog_Model.objects.filter(name='yy').order_by('-id').values()
Out[16]:
<QuerySet [{'id': 11, 'name': 'yy', 'num': 2}, {'id': 10, 'name': 'yy', 'num': 2}, {'id': 9, 'name': 'yy', 'num': 1}]>
In [17]:
Blog_Model.objects.all()[5:8].values()
Out[17]:
<QuerySet [{'id': 7, 'name': 'bb', 'num': 1}, {'id': 8, 'name': 'nn', 'num': 1}, {'id': 9, 'name': 'yy', 'num': 1}]>
 

查询相关API:

filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 条件选取querySet的时候,filter表示=。 field名称exact # 精确等于 like 'aaa' iexact # 精确等于 忽略大小写 ilike 'aaa' contains # 包含 like '%aaa%' icontains # 包含 忽略大小写 ilike '%aaa%' gt # 大于 gte # 大于等于 lt # 小于 lte # 小于等于 in # 存在于一个list范围内 startswith # 以...开头 istartswith # 以...开头 忽略大小写 endswith # 以...结尾 iendswith # 以...结尾,忽略大小写 range # 在...范围内 ctimerange=(datetime.date(2022,5,1),datetime.date(2022,5,16)) year # 日期字段的年份 month # 日期字段的月份 day # 日期字段的日 __isnull=True/False

all(): 查询所有结果

get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()--------

values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列

exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象

order_by(*field): 对查询结果排序

reverse(): 对查询结果反向排序

distinct(): 从返回结果中剔除重复纪录

values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列,添加参数flat = True,以列表形式显示结果。

count(): 返回数据库中匹配查询(QuerySet)的对象数量。

first(): 返回第一条记录

last(): 返回最后一条记录

exists(): 如果QuerySet包含数据,就返回True,否则返回False。

 

3.增

In [18]:
Blog_Model.objects.create(name='qq', num=4)
Out[18]:
<Blog_Model: Blog_Model object (14)>
In [19]:
Blog_Model(name='qq', num=3).save()
In [21]:
Blog_Model.objects.get_or_create(id=1, name='ww', num=1)
Out[21]:
(<Blog_Model: Blog_Model object (1)>, False)
 

get_or_create顾名思义,查询或者创建一条数据,首先是执行的时候首先会去查询有没有这个值,如果有就返回,没有就创建。 get_or_create会返回一个tuple,第一个值是查到或者创建的数据,第二个值是一个布尔,表示是否执行了创建操作。 在进行查询的时候和使用get查询类似,当查到超过一条数据的时候会触发MultipleObjectsReturned。 创建的时候也和使用create创建类似。 如果你正在使用MySQL,请确保使用READ COMMITTED 隔离级别而不是默认的REPEATABLE READ,否则你将会遇到get_or_create 引发IntegrityError 但对象在接下来的get() 调用中并不存在的情况。

 

4.删

In [24]:
Blog_Model.objects.filter(id=1).delete()
Out[24]:
(0, {'db_manager.Blog_Model': 0})
 

5.改

In [26]:
Blog_Model.objects.filter(id=4).update(name='yy')
Out[26]:
1