Django框架2(模板和ORM)

  • 模板同jinja2,这里不再详述
  • ORM配置同redis,也在settings.py文件中配置
  • 这里默认配置为sqlite
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
  • 修改为mysql配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 数据库主机
        'PORT': 3306,  # 数据库端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'xxxxx',  # 数据库用户密码
        'NAME': 'django_test'  # 数据库名字
    }
}
  • 这里要注意要使用mysql需要先安装pymysql: pip install PyMySQL 然后在初始化(在工程下的_init_.py)导入
from pymysql import install_as_MySQLdb
install_as_MySQLdb()
  • 模型类均被定义在对应子模块的models.py中,不同子模块分别定义,模型类同样需要继承自Models,需要导入:from django.db import models
  • 定义class继承自models.Model
class Some(models.Model):
    title = models.CharField(max_length=20)
    class Meta:
        db_table = 't_some'  # 指明数据库表名
  • 数据库迁移
    • 1.生成迁移文件:python manage.py makemigrations
    • 2.迁移到数据库:python manage.py migrate
  • 数据库操作
      • 1.save:通过模型对象,并给模型对象的属性赋值,最后调用.save()方法保存
book = User()
user.name = '王麻子'
user.age = 19
book.save()
    - 2.create:通过模型类.objects.create()保存
User.objects.create(
            name='张三',
            age=20
        )
- 查
    - get :查询单一结果(一般针对主键)  如:User.objects.get(id=10)
    - all:查询全部   如:User.objects.all()
    - count:查询结果数量   如:User.objects.count()
    - 条件查询:
    - filter 过滤出多个结果    语法:User.objects.filter(属性名称__比较运算符=值)   如:User.objects.filter(id__exact=10) 这里表示等于,等于时__exact可以省略不写
    - 比较运算符:__exact  表示等于
    - __contains表示包含   如User.objects.filter(name__contains='王')  表示查找名字包含王的
    - __startswith、__endswith:以指定值开头或结尾   如User.objects.filter(name__startswith='张')
    - 为空__isnull       如:User.objects.filter(name__isnull=False)    表示查询名字不为空的数据
    - 范围查询__in   如:User.objects.filter(age__in=[19,20,25])   表示查询年龄为19,20,25的数据
    - 比较查询 大于:__gt   如:User.objects.filter(age__gt=20)  表示查询age大于20的数据
    - 大于等于:__gte
    - 小于:__lt
    - 小于等于:__lte
    - 不等于:使用exclude过滤,即将filter换成exclude    如:User.objects.exclude(id=10)   表示查询所有id不等于10的数据
    - 日期查询:year、month、day、week_day、hour、minute、second,对日期时间类型的属性进行运算   如:User.objects.filter(birth__year=1990)   表示查询birth为1990年的所有数据
    - F对象:需要从django.db.models中导入
    - 当要比较两个属性时,即等号右边也是属性  如:User.objects.filter(age__gt=F('id'))   表示查询age比id大的所有数据
    - 并且F对象可以直接进行计算  如:User.objects.filter(age__gt=F('id')*2) 
    - Q对象:表示条件查询的逻辑与或非关系,Q对象用& | ~来表示与或非(sql里的and,or,not)
    - 与关系简写即可  如:User.objects.filter(age__gt=20,id__gt=10)   这里表示查询age大于20且id大于10的所有数据
    - 或关系:应将两个条件使用Q对象用|分隔,这里使用到Q也需要导入   如:User.objects.filter(Q(age__gt=20) | Q(id__gt=10))  在这里表示查询age大于20或者id大于10的所有数据
    - 非关系:User.objects.filter(~Q(id=10))  表示查询id不等于10的所有数据
    - 聚合函数:使用aggregate()过滤器调用聚合函数,聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和  注意使用这些函数时均需导入   如:User.objects.aggregate(sum(age))   这里会返回一个字典,键的格式为age_sum,即属性__函数名,值为函数运算结果
    - 这里要注意count一般不加aggregate,且只返回一个数字
    - 排序:order_by  如:User.objects.all().order_by('age')   这里是升序,降序只需要将age前面加个减号:User.objects.all().order_by('-age')
    - 关联查询:一对多,要在一的一端查询多的一端:一的一端对应的模型类对象.多的一端模型名小写_set,   在多的一端查询一的一端:多的一端的模型类对象.定义的关系类属性名称(外键属性)
- 改
    - save:先查询一个对象,再给该对象赋值修改,最后使用save保存
user = User.objects.filter(id=10)
user.name='王五'
user.save()
    - update:使用模型类.objects.filter().update(),会返回受影响的行数
User.objects.filter(id=10).update(name='王五')
- 删
    - 模型类对象.delete  
user = User.objects.get(id=10)
user.delete
    - 模型类.objects.filter().delete()    如:  User.objects.filter(id=10).delete
posted @ 2019-03-09 17:55  heyeege  阅读(125)  评论(0编辑  收藏  举报