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 不区分大小写

转载于:https://my.oschina.net/u/3861268/blog/1820440

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值