Django ORM操作

一、ORM关系对象映射
 
1.1 db first
- 先手动在数据库建库,建立表结构,再根据表结构在代码中生成类
1.2 code first
- 先直接在代码中写好类,设计表结构,然后通过ORM命令自动去创建这些表
  • 创建命令:
    python manage.py makemigrations
    python manage.py mkgrate

  • 创建类:必须继承 models.Model

from django.db import models

class UserInfo(models.Model):
    id = models.AutoField(primary_key=True)  #主键自增ID 对应mysql中id int not null auto_increment primary key
    name = models.CharField(max_length=32) #对应mysql 中 name char(32) not null

 

1.3 修改project同名下的settings文件

找到setting.py文件下的:DTABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #配置成自己要使用的数据库
        'NAME': 'blog', #数据库名
        'USER': 'username', #用户名
        'PASSWORD': 'xxxxxxxxx', #用户密码
        'HOST': 'localhost', #ip地址
        'PORT': '3306'  #端口
    }
}
  • 因为django 默认使用mysqldb模块在Py3中没有,所以这儿改用pymysql
    在project同名的__init__.py 文件中:
    import pymysql
     
    pymysql.install_as_MySQLdb()
二、ORM中的增删改查
1. ###增加数据: models.TB_name.objects.create(filed1= 'xxx', field2= 'xxxx') #第一种创建方式   obj = models.TB_name(field1= 'xxx', field2= 'xxxx') #第二种创建方式 obj.save()   dic = {'field1': 'xxx', 'field2': 'xxxx'} models.TB_name.objects.create(**dic)
  1. 查询数据

查询所有,数据类型:Query_set 类似列表
res = models.TB_name.objects.all()
res[0].field1 #列表中存着一个个 Query_set实例,通过点字段名来访问数据
 
查询所有,数据类型:Query_set 类似列表
res = models.TB_name.objects.filter(id__gt=1, field2= 'xxxx')
相当于mysql 中 select * from TB_name where id>1 and field2= 'xxxx';
 
统计总共有多少数据.count()
models.TB_name.objects.all().count()
 
查询排序.order_by()
models.TB_name.objects.all().order_by()
 
范围查询一.filter(id__range=[3,7[)
 
范围查询二 .filter(id__in= [2,4,5,6,7])
 

条件选取querySet的时候,filter表示=,exclude表示!=。

查询除了匹配条件之外的所有.exclude(id__gt=3)
models.TB_name.objects.exclude(id__gt=3)
先exclude后filter:
models.TB_name.objects.exclude(xxxx=xx).filter(xxxx=xx)
 

  1. 删除

  2. 更新

  • 各双下划线查询条件

__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

 

posted @ 2018-09-16 00:58  G1733  阅读(248)  评论(0编辑  收藏  举报