单表查询
准备工作
创建数据库
? 在 cmd 里创建数据库
- settings
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'orm001',
- 'USER':'root',
- 'PASSWORD':'123',
- 'HOST':'127.0.0.1',
- 'PORT':3306,
- }
- }
修改链接方法
? 项目文件夹下的 init 文件中写上下面内容, 用 pymysql 替换 mysqldb
- import pymysql
- pymysql.install_as_MySQLdb()
创建数据库表
models.py
- class Userinfo(models.Model):
- id = models.AutoField(primary_key=True)
- name = models.CharField(max_length=10)
- bday = models.DateField()
- checked = models.BooleanField()
- # 在已经创建成功的表中添加新字段, 需要设置默认值, 对应默认不为空的已经有的记录的新字段的值
- # 或者在新字段的参数中设置 null=True
执行命令创建
- python3 manage.py makemigrations
- python3 manage.py migrate
- # 数据库同步指令
记录操作
创建记录
- def index(request):
- new_obj = models.Userinfo(
- name = "张三",
- bday = "1995-5-5",
- checked = 1,
- )
- new_obj.save()
- # 翻译成 sql 语句, 然后调用 pymysql, 发送给服务端 insert into app01_userinfo values('张三','1995-5-5',1)
- return render(request,"index.html")
增
方式一:
- def index(request):
- new_obj = models.Userinfo(
- name = "张三",
- bday = "1995-5-5",
- checked = 1,
- )
- new_obj.save()
- return render(request,"index.html")
方式二:
- def index(request):
- ret = models.Userinfo.objects.create(
- name = "李四",
- bday = "1996-6-6",
- checked = 0,
- )
- return render(request,"index.html")
删
简单查询: filter() -- 结果是 queryset 类型的数据里面是一个个的 model 对象, 类似于列表
- models.UserInfo.objects.filter(id=7).delete() # queryset 对象调用, 删除符合条件的所有记录
- models.UserInfo.objects.filter(id=7)[0].delete() # model 对象调用, 删除符合条件的记录列表的 [0] 索引的记录
改
方式一:
- models.Userinfo.objects.filter(id=3).update(
- name = "张三",
- checked = 0
- )
方式二:
- def index(request):
- ret = models.Userinfo.objects.filter(id=3)[0]
- ret.name = "李四",
- ret.checked = 1
- ret.save()
- return render(request,"index.html")
? model 对象不能调用 update 方法
特殊:
? auto_now 参数, 创建记录会自动添加创建时的时间, 但是更新时只有使用 save 方法的方式 2 才能自动更新时间
now = models.DateTimeField(auto_now=True,null=True)
时间问题
- models.UserInfo.objects.create(
- name='张三',
- bday=current_date,
- # now=current_date, 直接插入时间没有时区问题
- checked=0
- )
但是如果让这个字段自动来插入时间, 就会有时区的问题, auto_now_add 创建记录时自动添加当前创建记录时的时间, 存在时区问题
now = models.DateTimeField(auto_now_add=True,null=True)
解决方法:
settings 配置文件中将 USE_TZ 的值改为 False
- # USE_TZ = True
- USE_TZ = False # 告诉 MySQL 存储时间时按照当地时间来寸, 不要用 utc 时间
使用 pycharm 的数据库客户端的时候, 时区问题要注意
批量插入(bulk_create)
- obj_list = []
- for i in range(20):
- obj = models.Book(
- title=f'abc{i}',
- price=20+i,
- publish_date=f'2019-09-{i+1}',
- publish='24 期出版社'
- )
- obj_list.append(obj)
- models.Book.objects.bulk_create(obj_list) #批量创建
request.POST -- querydict 类型
# {'title': ['asdf'], 'price': ['212'], 'publish_date': ['2019-09-12'], 'publish': ['asdf']}
data = request.POST.dict() -- 能够将 querydict 转换为普通的 python 字典格式
- # 创建数据
- models.Book.objects.create(
- # title=title,
- # price=price,
- # publish_date=publish_date,
- # publish=publish
- **data
- )
查询 API
- models.Book.objects.filter.all()
- # 结果为 queryset 类型
- models.Book.objects.filter(title='abc7',publish='24 期出版社') # 多条件查询
- # 查询条件不能匹配到数据时, 不会报错, 返回一个空的 queryset, <QuerySet []>, 如果没有写查询条件会获取所有数据, queryset 类型的数据还能够继续调用 fitler 方法
- models.Book.objects.get()
- # 得到的是一个 model 对象, 有且只能有一个
- # 查不到数据会报错 :Book matching query does not exist.
- # 超过一个就报错 :returned more than one Book -- it returned 13!
- models.Book.objects.exclude()
- # 排除
- # object 能够调用, models.Book.objects.exclude(title__startswith='abc')
- # queryset 类型数据能够调用, models.Book.objects.all().exclude(title__startswith='abc')
- models.Book.objects.all().order_by('-price','id')
- # 排序
- # 默认按照 id 来升序排列, 返回的是 queryset 类型, 降序加 "-" 号
- odels.Book.objects.all().order_by('id').reverse()
- # 反转
- # 数据排序之后才能反转
- models.Book.objects.all().count()
- # 计数, 统计返回结果的数量
- models.Book.objects.all().first()
- # 返回第一条数据, 返回值是 model 对象类型
- models.Book.objects.all().last()
- # 返回最后一条数据, 返回值是 model 对象类型
- models.Book.objects.filter(id=9000).exists()
- # 有数据返回 True, 没有结果返回 False
- models.Book.objects.all().values()
- # 返回一个 valueQuerySet, 一个特殊的 QuerySet, 得到的不是 model 实例化对象, 而是一个可迭代的字典序列
- models.Book.objects.all().values_list()
- # 与 values 相似, 它返回的是一个元组序列
- models.Book.objects.all().values.distinct()
- # 去重, 需要配合 values 或者 values_list 来使用
filter 双下方法模糊查询
- models.Book.objects.filter(price__gt=35) # 大于
- models.Book.objects.filter(price__gte=35) # 大于等于
- models.Book.objects.filter(price__lt=35) # 小于
- models.Book.objects.filter(price__lte=35) # 小于等于
- models.Book.objects.filter(price__range=[35,38]) # 大于等于 35, 小于等于 38
- models.Book.objects.filter(title__contains='abc') # 字段数据中包含这个字符串的数据都要
- models.Book.objects.filter(title__icontains='python') # 不区分大小写, 字段中包含这个字符串的数据都要
- models.Book.objects.filter(title__startswith='py') # 以... 开头
- models.Book.objects.filter(title__istartswith='py') # 不区分大小写, 以... 开头
- models.Book.objects.filter(publish_date__year='2018') # 2018 年的数据都要
- models.Book.objects.filter(publish_date__year__gt='2018') # 年数大于 2018 的数据都要, 直接写数字也可以
- models.Book.objects.filter(publish_date__year='2019', publish_date__month='8', publish_date__day='1') # 2019 年, 8 月, 1 日的数据
- models.Book.objects.filter(publish_date__isnull=True) # 这个字段为空的数据
单表查询
来源: http://www.bubuko.com/infodetail-3305042.html