zoukankan      html  css  js  c++  java
  • 十 .Django 单表操作(ORM)

    一 .ORM--------单表操作

    1. 创建orm表

    python manage.py makemigrations  # 创建生成表的脚本   
    python manage.py  # 生成数据库表
    2、必须安装pymysql  pip install pymysql
    
    3、找到项目名文件下的__init__,在里面写入:
    import pymysql
    pymysql.install_as_MySQLdb()
    # 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

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

    # 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('删除成功')

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

       filter()过滤
    [:3]截取
    first()第一条
    last()最后一条
    values()返回集合对象字典
    values_kist()返回集合元祖对象
    exclude()不包含
    distinct()去除重
    count()获取总记录数

    order_by()排序
    get()获取
    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()  # 获取记录数 返回一个数字
    book_list = Book.objects.order_by('name')  # 按name进行排序
      return render(request,'index.html',{'book_list':book_list})

     4.通过视图函数对数据表进行查询(万能的双下划线单表操作)

    __gt 大于   __lt 小于    __icontains包含    __in包含   not_in 不包含  __range 在范围内   


    Book.objects.filter(price__gt=50)  # 查询出价格大于50的
    Book.objects.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的表示大小写不敏感 Book.objects.filter(pub_date__year=2016)  # 查询所有pub_date为2016年的记录
    __exact        精确等于 like 'aaa'
    __iexact       精确等于 忽略大小写 ilike 'aaa'
    __contains     包含 like '%aaa%'
    __icontains    包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
    __gt      大于
    __gte     大于等于
    __lt      小于
    __lte     小于等于
    __in      存在于一个list范围内
    __startswith    以...开头
    __istartswith   以...开头 忽略大小写
    __endswith      以...结尾
    __iendswith     以...结尾,忽略大小写
    __range      在...范围内
    __year       日期字段的年份
    __month      日期字段的月份
    __day        日期字段的日
    __isnull=True/False
    __isnull=True 与 __exact=None的区别

     5. 获取orm对应原生的sql语句

      author_obj=models.Author.objects.filter(id=2)
    
      print(author_obj.query)
    、在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',
            },
        }
    }
  • 相关阅读:
    【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)
    【BZOJ5303】[HAOI2018]反色游戏(Tarjan,线性基)
    【BZOJ5304】[HAOI2018]字串覆盖(后缀数组,主席树,倍增)
    【BZOJ5305】[HAOI2018]苹果树(组合计数)
    【BZOJ5300】[CQOI2018]九连环 (高精度,FFT)
    【BZOJ5292】[BJOI2018]治疗之雨(高斯消元)
    【BZOJ5298】[CQOI2018]交错序列(动态规划,矩阵快速幂)
    【BZOJ5289】[HNOI2018]排列(贪心)
    Codeforces Round #539 Div1 题解
    【BZOJ5288】[HNOI2018]游戏(拓扑排序)
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11355567.html
Copyright © 2011-2022 走看看