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會緩存查詢集中的數據,
      下次用到時,讀取緩存
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章