zoukankan      html  css  js  c++  java
  • ORM的单表增删改查

    一、与数据库的映射关系
     
              类名 <-------> 表名
              属性 <------->字段
    属性的约束 <------->字段的类型
       实例对象 <-------> 表记录
     
    在setting中如下设置,可以查看翻译成的sql语句
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
     
    二、创建类
     
    1、在文件modal.py里创建类,继承models.Model
    class Student(models.Model):
        nid=models.AutoField(primary_key=True)            #int自增   ,并设为主键
        name=models.CharField(max_length=10)              #varchar  ,
        birth=models.DateField()                                      #Date
        class_id=models.IntegerField(default=0)                #int
     
    之后要告诉Django使用这些模型,需要在setting中INSTALLED_APPS,添加当前model目录的位置,'app01.apps.App01Config',这个列表的元素是所有注册了的应用名称
     
    然后在终端输入
    python manage.py makemigrations    此时会在models.py 的目录下生产migrations文件夹,里面是一些配置
    python manage.py migrate               此时会在数据库生产表,表名会默认带上应用的目录名前缀
     
    如果之后要增加字段,例如
    xxss_id=models.IntegerField()
    如果没有给默认值,此时执行python manage.py makemigrations 会提示
     
    实例化对象就是插入信息
    s=Student(name="alex", birth="2017-12-12")
    s.save()       #提交
     
    如果用不是Django自带的数据库,要注意设置:
    在setting中修改
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'day74',          #你的数据库名称
            'USER': 'root',              #你的数据库用户名
            'PASSWORD': '123',     #你的数据库密码
            'HOST': '',                     #你的数据库主机,留空默认为localhost
            'PORT': '3306',             #你的数据库端口
            
            'OPTIONS':{                #严格模式,not null  的时候,不能为空
                'init_command':"SET sql_mode='STRICT_TRANS_TABLES'"
            },
        }
    }
    然后在models.所在目录的__init__.py中添加
    import pymysql
    pymysql.install_as_MySQLdb()
     
    二、常用字段类型
    models.AutoField(primary_key=True)    #int自增   ,并设为主键
    models.CharField(max_length=10)         #varchar 类型 ,
    models.DateField()                                #日期类型
    models.IntegerField(default=0)              #int
    models.EmailField()        #email类型,其实也是字符串,只是Django在会检测是否符合email格式
    models.DecimalField(max_digits=5,decimal_places=2)    #精确小数类型,总长对多5,小数位最多2,999.99
     
     
    objects 管理器
    一、增加
     
    方式1 :
    s=Student(name='',class_id='')
    s.save()
    方式2:
    stu_obj=Student.objects.create(name='',class_id='')'
    返回创建的记录对象
     
    二、删除
    查询出然后删除
    Student.objects.filter(nid=id).delete()
     
    三、修改
    Student.objects.filter(nid=id).update(name='xx',class_id='ss')
     
    #如果request.POST里所有的内容都要被更新到表中,可以
    Student.objects.filter(nid=id).update(**request.POST)
    ##关键字传参,注意POST里的crsf相关的
    ##不能get(xx).update(...)
     
    对于日期类型的字段要注意,input框中要规定好日期格式,否则无法识别。也不能直接在pycharm的Database工具里直接修改日期
    <input type="date" name="birth" value="{{ stu.birth|date:'Y-m-d' }}">
     
    四、查询
     
    1、单表查询
    QueySet 不支持负索引 ,[-3] 
    Student.objects.all()              #返回QuerySet类型,查询所有记录,[obj1,obj2...]
    Student.objects.filter()          #返回QuerySet类型查询符合条件的记录
    Student.objects.exclude()     #返回QuerySet类型查询不符合条件的记录
     
    Student.objects.get()              #返回models对象,查询结果必须有且只有一个,否则报错
    Student.objects.all().first()      #返回models对象,取出查询结果中的第一个
    Student.objects.filter().last()    #返回models对象,取出查询结果中的最后一个
     
    Student.objects.all().values("name","class_id")     #只用来显示,返回QuerySet类型,元素是字典[{'name':'xx','class_id':'zz'},{'name':'xx','class_id':'zz'}... ]
    Student.objects.all().values_list("name","class_id")   #只用来显示,返回QuerySet类型,元素是元组[(xx,zz),(aa,bb)...]
     
    Student.objects.all().order_by("class_id"  #按class_id升序 排序,不指定则按主键排序
    Student.objects.all().order_by("-class_id")   #加个负号,按class_id降序排序
     
    Student.objects.all().reverse()    #对结果反向排序,可以回避QueySet 不支持负索引的问题
     
    Student.objects.all().count()          #返回记录的个数
    Student.objects.all().exists()         #是否有数据,返回True或False
     
    Student.objects.values("class_id").distinct()  #对结果去重
    只有values,values_list 的去重有意义,而all、filter等查出的结果,都是 models对象的列表[obj1,obj2..]不可能有重复的
     
    备注:对于日期数据
    Student.objects.filter(birth__year="2017")      #查询年份是2017的
    Student.objects.filter(birth__month="12")      #查询月份是12的
    Student.objects.filter(birth__day="15")          #查询天数是12的
     
    2、双下划线的单表查询
    Student.objects.filter(id__gt=1,id__lt=10)      #id 大于1 且 小于10的   __gt=  相当于>  ,__lt= 相当于<
    Student.objects.filter(id__in[11,22,33])           #id 值等于11,22,33的数据
    Student.objects.exclude(id__in=[11,22,33])      #not in
    Student.objects.filter(name__contains="e")        #name包含'e',sql里的like
    Student.objects.filter(name__icontains="e")       #name包含e 不区分大小写
    Student.objects.filter(name__iexact="alex")          #name 是alex的,不区分大小写
    Student.objects.filter(id__range=[1,5])            #范围 between  and  包括5
    startswith,istartswith,endswith,iendswith            #开头结尾,i 不区分大小写
     
     
     
     
     
     
     
  • 相关阅读:
    WINCE/WM5.0如何让安装完后自动运行程序
    Android 图片透明度处理代码
    windows mobile UI 自定义开始菜单图标
    Windows mobile 6捕获键盘操作
    HTTP的post和get总结
    提供一个Windows mobile Native UI 程序,循序渐进开发,并附有代码!
    Windows Mobile 中ComboBox【下拉列表】的使用
    注册表修改今日桌面左右软键的功能
    .net compact framework 注册表操作
    两种实现Toast 的例子(图片&文字)
  • 原文地址:https://www.cnblogs.com/tangjianyu/p/8018745.html
Copyright © 2011-2022 走看看