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
相关文章
相关标签/搜索