Django ORM 单表操作

默认使用sqllite数据库

创建表

# models.py

form django.db import models

class Book(models.Model):  # 表名book,django会自动使用项目名+我们定义的表名
  # 如没有自定义主键,django会自动添加一个主键,字段名id 自增
  name = models.CharField(max_length=20)  # 字段名name 类型 vachar(20)
  price = models.IntegerField()   # 字段名price 类型int
  pub_date = models.DateField()   # 字段名pub_date 类型 date (时间戳)
author = models.CharField(max_length=32,null=False) # 默认可以为空,设置null=False则不能为空

  def __str__(self):
    return self.name  # 打印实例对象时显示为self.name

python manage.py makemigrations  # 创建生成表的脚本   

python manage.py  # 生成数据库表

如果要使用mysql 

1、需要在settings.py中修改数据库的信息

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql', 

        'NAME': 'books',    #你的数据库名称

        'USER': 'root',   #你的数据库用户名

        'PASSWORD': '', #你的数据库密码

        'HOST': '', #你的数据库主机,留空默认为localhost

        'PORT': '3306', #你的数据库端口

    }

}

2、必须安装pymysql  pip install pymysql

3、找到项目名文件下的__init__,在里面写入:

import pymysql
pymysql.install_as_MySQLdb()

通过视图函数对数据表进行增删改(单表操作)

# views.py

from django.shortcuts import render
from app_name.models import *  # 导入models.py

def add(request):  # 增加数据的视图函数
  # 方式一
  b = Book(name='python基础',price=99,author='yuan',pub_date='2017-12-12')
  b.save()

  # 方式二
  Book.objects.create(name='python基础',price=99,author='yuan',pub_date='2017-12-12')
  # Book.object.create(**dic)  # 此写法必须客户端传来的值与表中的值一一对应时,就可直接使用客户端传来的字典
  return HttpResponse('添加成功')
  

def update(request):  # 修改数据的视图函数
  # 方式一
  b = Book.objects.get(author='yuan')  # 使用get会得到一个Book的实例对象,但当get到0个或多个对象时会报错
  b.price = 109  
  b.save()  # 该方式会对每一个字段重新赋值,效率低
  # 方式二
  Book.objects.filter(author='yuan').update(price=109)  # 使用filter会得到一个QuerySet集合对象(里面为每一个实例的Book对象),因为根据筛选可以得到多条结果;将所有作者为yuan的书的价格改为109
  # 仅会对要修改的字段进行赋值,效率高

return HttpResponse('修改成功')


def delete(request):
  # 删除数据的视图函数
  Book.objects.filter(author='yuan').delete()

return
HttpResponse('删除成功')

通过视图函数对数据表进行查询(单表操作)

def select(request):
  book_list = Book.objects.filter(id=2)  # 按条件查询 返回一个QuerySet集合对象
  book_list = Book.objects.all()  # 查询出所有结果 返回一个QuerySet集合对象
  book_list = Book.objects.all()[:3]  # 切片操作 取前三条; [::2]步长为2隔着取; [::-1]倒着取
  book_list = Book.objects.first()  # 取第一条 返回一个实例对象
  book_list = Book.objects.last()  # 取最后一条 返回一个实例对象
  book_list = Book.objects.get(id=2)  #按条件查询 返回一个Book实例对象 只能取出一条记录时才不报错
book_list = Book.objects.filter(id=2).values('name','price') # select name,price form book where id=2; 此时返回一个QuertSet集合对象,但是这个集合中是一个个的字典对象
book_list = Book.objects.filter(id=2).values_list('name','price') # select name,price form book where id=2; 此时返回一个QuertSet集合对象,但是这个集合中是一个个的元组对象
book_list = Book.objects.exclude(author='yuan')  # 返回不包含author='yuan' 的QuerySet
book_list = Book.objects.all().values('name').distinct()  # 根据name去重,不加具体的字段无意义,因为表中有主键,记录不会重复
book_list = Book.objects.all().count()  # 获取记录数 返回一个数字
  return render(request,'index.html',{'book_list':book_list})


# 万能的双下划线
  Book.objects.filter(price__gt=50)  # 查询出价格大于50的
Book.objexts.filter(name__icontains='p')  # 查询出名字里面包含p的,不区分大小写;
name__contains='p'区分大小写
#    models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
#
#    models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
#    models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
#
#    models.Tb1.objects.filter(name__contains="ven")
#    models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
#
#    models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
#
#    startswith,istartswith, endswith, iendswith, # 以什么开头,以什么结尾 带i的表示大小写不敏感
 

查询的相关api

# 查询相关API:

#  <1>filter(**kwargs):      它包含了与所给筛选条件相匹配的对象

#  <2>all():                 查询所有结果

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

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

#  <4>values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
                                     
#  <5>exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象

#  <6>order_by(*field):      对查询结果排序

#  <7>reverse():             对查询结果反向排序

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

#  <9>values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

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

# <11>first():               返回第一条记录

# <12>last():                返回最后一条记录

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

如何获取orm对应原生的sql语句

1、author_obj=models.Author.objects.filter(id=2)

  print(author_obj.query)

2、在settings.py配置文件中加上logging,可在服务端输入orm对应的sql语句

# 将以下代码加入settings.py文件的尾部

LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }

猜你喜欢

转载自www.cnblogs.com/dangrui0725/p/9614925.html