2、Django-mysql配置和使用

数据库配置

  1. 创建mysql数据库: create database db_django01 charset=utf8;

  2. 配置mysql

 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',    # 数据库产品
         'HOST': "localhost",           # 数据库ip
         'PORT': 3306,                  # 数据库端口
         'USER': "root",                # 用户名
         'PASSWORD': "mysql",           # 密码
         'NAME': "db_django01",         # 数据库名
     }
 }
  1. 安装 pymysql 第三方包:pip install pymysql

  2. 与项目同名的包 下的 __init__.py 文件中,设置模块名:

     import pymysql
     pymysql.install_as_MySQLdb()
    

执行迁移命令

  • 生成迁移文件: python manage.py makemigrations
  • 生成表: python manage.py migrate

模型类定义

  • 继承models.Model 类定义模型类

  • 在模型类中定义属性,格式:属性名 = models.字段类型(字段选项)

    • 属性名不能是python 保留关键字
    • 属性名不能包含两个连续的下划线, 例: 属性名__name 不合法
  • 默认会自动生成id主键

  • 示例:

    class Department(models.Model):
        name = models.CharField(max_length=20)
        create_date = models.DateField(auto_now_add=True)
        is_delete = models.BooleanField(default=False)
    
        class Meta: 
            # 指定表名
            db_table = 'department'
    
    class Employee(models.Model):
        choices_gender = (
            (0, '男'),
            (1, '女'),
        )
        name = models.CharField(max_length=20)
        age = models.IntegerField()
        gender = models.IntegerField(default=0, choices=choices_gender)
        salary = models.DecimalField(max_digits=8, decimal_places=2)
        comment = models.CharField(max_length=300, null=True, blank=True)
        hire_date = models.DateField(auto_now_add=True)
        department = models.ForeignKey('Department')
    
        class Meta: 
            # 指定表名
            db_table = 'employee'
    

模型管理器

管理器中的方法 返回类型 作用
模型类.objects.create() 模型类对象 创建一个对象(新增一条数据)
模型类.objects.get() 模型对象 查询一个对象,且只能有一个:
如果查到多条数据,则报:
MultipleObjectsReturned
如果查询不到数据,则报:DoesNotExist
模型类.objects.all() QuerySet 查询所有的对象
模型类.objects.count() 数字 查询总共有多少条数据
模型类.objects.filter() QuerySet 查询满足条件的对象
模型类.objects.exclude() QuerySet 查询不满条件的对象
模型类.objects.order_by() QuerySet 对查询结果集进行排序
模型类.objects.aggregate() 字典
例如: {‘salary__avg’: 9500.0}
进行聚合操作 Sum, Count, Max, Min, Avg

数据增删改

  • 新增
    • 方式1:模型类.objects.create(属性1=值1,属性2=值2,…)
    • 方式2:模型对象.save()
  • 删除
    • 方式1:模型类.objects.filter(查询条件).delete()
    • 方式2:模型对象.delete()
  • 更新
    • 方式1:模型类.objects.filter(查询条件).update(属性1=值1,属性2=值2,…)
    • 方式2:模型对象.save()

查询

条件查询

用法:模型类.objects.filter(模型类属性名__比较运算符 = 值)

  • 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
  • 比较运算符

    • exact
    • contains / endswith / startswith
    • isnull
    • in
    • gt(greater than)、lt(less than)、gte、lte
    • year、month、day、week_day、hour、minute、second
  • 示例

    # 查询名字包含 ‘马’ 的员工
    Employee.objects.filter(name__contains='马')
    

exclude方法

# 例:查询id不为3的员工
Employee.objects.exclude(id=3)

F对象

作用:查询条件中要比较表中的两个字段

 # 例:查询年龄大于id的员工信息(无实际意义)
 select * from employee where age > id; 
 Employee.objects.filter(age__gt=F('id'))

Q对象

作用:对查询条件进行 与 或 非 (& | ~) 的逻辑操作

  • 与: Q(查询条件1) & Q(查询条件2)

  • 或: Q(查询条件1) | Q(查询条件2)

  • 非: ~Q(查询条件)

示例

Employee.objects.filter(Q(id__gt=3) & Q(age__gt=30))    # 与
Employee.objects.filter(Q(id__gt=3) | Q(age__gt=30))	# 或
Employee.objects.filter(~Q(id=3))						# 非

aggregate`方法

用法: 模型类.objects.aggregate(聚合类(‘属性名’))

  • 常用聚合类有:Sum, Count, Max, Min, Avg等

  • 返回值是一个字典, 格式: {'属性名__聚合函数': 值}

  • 示例:

    Employee.objects.aggregate(Avg('salary'))
    

order_by方法

  • 升序: 模型类.objects.order_by(‘属性名’)
  • 降序: 模型类.objects.order_by(’-属性名’)

关联查询

  • 通过对象实现

    • 一查多

      d = Department.objects.get(name=‘研发部’) 
      d.employee_set.all()    # 属性:(多)类名小写_set
      
    • 多查一

      e = Employee.objects.get(name='赵小二')
      e.department	# 关联属性
      
  • 通过模型类实现

    • 一查多:多类名.objects.filter(关联属性__属性名__条件名=值)

    • 多查一: 一类名.objects.filter(多类名小写__属性名__条件名=值)

      示例

      Employee.objects.filter(department__name__exact='研发部')
      Department.objects.filter(employee__name__exact='赵小二')
      # 简写
      Employee.objects.filter(department__name='研发部')
      Department.objects.filter(employee__name='赵小二')
      

查询集QuerySet

  • 查询集的方法
    get, all, count, filter, exclude, order_by, aggregate, exists
  • 限制查询集
    • 通过下标取元素
    • 切片操作,返回一个新的查询集
    • 下标不能为负数
  • 两大特性
    • 惰性查询: 用到查询集中的数据时,才会去查询数据库
    • 缓存: 当第一次遍历使用了查询集中所有的数据后,django会缓存查询集中的数据,
      下次用到时,读取缓存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章