Django——6 模型基础ORM 数据库连接配置 模型的创建与映射 数据的增删改查

Django

  1. Django的ORM简介
  2. 数据库连接配置
  3. 模型的创建与映射
  4. Django之Model字段详解
  5. 数据库的增删改查
    1. 增数据
    2. 查数据及补充
    3. 改数据
    4. 删数据

 

 

Django的ORM系统分析

  1. ORM概念:对象关系映射(Object Relational Mapping,简称ORM)
  2. ORM的优势:不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。

Django的模型映射关系

  • 模型类必须都写在app下的models.py文件中。
  • 模型如果需要映射到数据库,所在的app必须被安装.
  • 一个数据表对应一个模型类,表中的字段,对应模型中的类属性.

 


 

 

数据库的配置

 在项目的settings文件中的DATABASES

注意:NAME是数据库的库名,在使用之前,需要先在数据库中新建一个对应名字的database

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.msyql',
        'NAME': database_name,
        'USER': username,
        'PASSWORD': password,
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

 

  •  创建一个管理员用户pywjh账号,密码为 pywjh:CREATE USER 'pywjh'@'%'IDENTIFIED BY 'pywjh';
  • 给这个用户授予所有远程访问,这个用户主要用于管理整个数据库,备份,还原等操作。
    • GRANT ALL ON *.* TO 'pywjh'@'%';
  • 使授权立即生效:FLUSH PRIVILEGES;

 

pymsql数据库连接器的配置

设置连接器为pymysql:
主目录下的的__init__.py文件添加下面两句

import pymysql
pymysql.install_as_MySQLdb()

 




使用Django中的模型

 首先,在哪个APP下创建模型,都要先在settings中注册APP

APP  my_sql下的models.py

from django.db import models


# Create your models here.
class User(models.Model):
    id = models.AutoField(primary_key=True) # id属性,不用添加Django也会自动添加
    name = models.CharField(max_length=10)
    age = models.IntegerField()

    def __str__(self):   # 定义输出方法,在查询的时候使用
        return 'User<id=%s, name=%s, age=%s>'%(
            self.id, self.name, self.age
        )

 

 然后在创建映射文件:( 后面可以跟APP的名字,不跟则表示全部都映射)
python manage.py makemigrations [app_name]

将映射数据提交到数据库中:

python manage.py migrate [app_name]

 

 这是就会在数据库中看到自己创建的模型

打开数据我们能看到创建的以app名_模型名的数据表,而其他的一些表格是django自动生成的.
注意:如果要删除表,那么可以去django模型中注释掉模型类,然后执行映射的命令,不要手动在命令行里面去删除.


 

 

 数据库的增删改查

增:

 配置到url后,在视图views中:

from django.http import HttpResponse
from .models import User

def add(request):
    # # 方法一
    # user = User()
    # user.name = '张三'
    # user.age = 22
    # user.save()
    # # 方法二
    # user = User(name='李四', age=23).save()
    # # 方法三
    # User.objects.create(name='王五', age=22)
    # 方法四
    User.objects.get_or_create(name='周六', age=24) # 这个方法不会重复添加

    return HttpResponse('添加数据成功')

 检查数据库:

 

查:

views中:

查看全部数据

from django.http import HttpResponse
from .models import User

def get(request):
    # 获取全部数据
    result = User.objects.all()
    print(result)
    return HttpResponse('查询数据成功')

User.objects.all()——后台输出:

查询一个数据:

def get(request):
    # 查村一个数据
    result = User.objects.get(id=1)
    print(result)

    return HttpResponse('查询数据成功')

 

查询满足条件的数据:

def get(request):
    # 查询满足条件的数据
    result = User.objects.filter(name='王五')
    print(result)

    return HttpResponse('查询数据成功')

 

注意:

  • 通过print可以在后台看到我们访问到的数据,并且输出方式就是模型中的__str__的格式.
  • all()和filter()方法返回的是QuerySet对象.
  • get()方式返回的单个对象,如果符合条件的对象有多个,则get报错!
  • 1.从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet.
  • 2.QuerySet是可迭代对象.
  • 3.QuerySet支持切片, 不支持负索引.
  • 4.可以用list强行将QuerySet变成列表.

补充:

获取一个属性的搜索数据:

def get(request):
    # 单独获取一个属性的全部数据
    result = User.objects.values('age')
    print(result)

    return HttpResponse('查询数据成功')

去重:

def get(request):
    # 单独获取一个属性的全部数据,并去重
    result = User.objects.values('age').distinct()
    print(result)

    return HttpResponse('查询数据成功')

 

 

改:

在操作之前,先在models中在添加一个city的属性,规定模型添加属性要加上默认值,不要忘记创建映射文件已经映射数据

from django.db import models


# Create your models here.
class User(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    city = models.CharField(max_length=20, default='北京')

    def __str__(self):
        return 'User<id=%s, name=%s, age=%s>'%(
            self.id, self.name, self.age
        )

映射文件以后再查看数据库:

views:

def update(request):
    # 先查找到数据在进行修改
    res = User.objects.get(name='张三')
    res.city = '武汉'
    res.save()
    # 用update直接修改 # update针对的是QuerySet类型的数据
    User.objects.filter(name='李四').update(city='重庆')
    return HttpResponse(' 数据修改成功')

 

删:

所有的方法都是用与delete方法

def delete(request):
    result = User.objects.get(id=1)
    result.delete()

    User.objects.filter(name='周六').delete()
    return HttpResponse('删除数据成功')

 

 

posted @ 2018-12-26 14:37  pywjh  阅读(311)  评论(0编辑  收藏  举报
回到顶部