Django学习笔记之model篇(一) 将模型类映射到数据库: 数据的增删改查

数据库的配置:

1.在settings.py中配置DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',               # 数据库引擎
        'NAME': 'mydb',                                                      #数据库名称
        'USER': 'admin',                                                      # 链接数据库的用户名
        'PASSWORD': 'Root110qwe',                                # 链接数据库的密码
        'HOST': '127.0.0.1',                                                # mysql服务器的域名和ip地址
        'PORT': '3306',                                                        # mysql的一个端口号,默认是3306
    }
}

2.pymsql数据库连接器的配置:
在虚拟环境中安装pymysql: pip install pymysql
设置连接器为pymysql:在主目录下的的init.py文件添加下面两句

import pymysql
pymysql.install_as_MySQLdb()

3.使用django中的模型:

# blog/models.py
from django.db import models
# Create your models here.

class User(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)
    age = models.IntegerField()

    # 这个__str__方法的作用我们将在查询时看到的样式
    def __str__(self):
        return 'User<id=%s,name=%s,age=%s>'%(
            self.id,self.name,self.age)

1.首先执行以下命令,要创建映射文件

# 在执行前,保证我们创建模型的APP是已经注册过的APP
python  manage.py   makemigrations blog

2.执行以下命令,将映射文件中的映射数据提交到数据库中

python  manage.py   migrate blog

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

数据的增删改查

1.增加数据

在视图函数中导入User模型类,然后使用下面的方法添加数据

from .models import User

def add_user(request):
    # F1
    xps = User(name='xps',age=18)
    xps.save()
    # F2
    xps2 = User()
    xps2.name='xps2'
    xps2.age=17
    xps2.save()
    # F3
    User.objects.create(name='xps3',age=19) # 这种方法不用save了
    # F4
    User.objects.get_or_create(name='xps4',age=20) # 存在则不添加,不存在则添加
    return HttpResponse("插入数据成功")

2.查找数据

在视图函数中导入User模型类,实现简单的查找

from .models import User

def search_user(request):
    rs = User.objects.all() # 返回的是 QuerySet类型的
    rs = User.objects.get(id=2) # get()方式返回的单个对象,如果符合条件的对象有多个,则get报错!

    rs = User.objects.first() # 只能有一条,不能查有多个相同值的数据,不然会报错
    rs = User.objects.filter(name='xps')  # 返回的是QuerySet类型
    rs = User.objects.exclude(name='xps2') # 除了...
    rs = User.objects.last() # 最后一个值
    rs = User.objects.order_by('age') # 以...进行排序
    rs = User.objects.order_by('-age') # 以...进行排序(逆向)
    rs = User.objects.order_by('age','id') # 以...进行排序(多个值)
    rs = User.objects.all().values()  # 变换成字典类型输出
    rs = User.objects.count()  # 查询到的数据的个数

    ###### 查询对象的条件
    # exact 相当于等于号:
    rs = User.objects.filter(name__exact='xiaoming')
    # iexact:跟exact,只是忽略大小写的匹配。
    # contains 包含:
    rs = User.objects.filter(name__contains='xiao')
    # icontains 跟contains,唯一不同是忽略大小写。

    # startwith 以什么开始:
    rs = User.objects.filter(name__startswith='xiao')
    # istartswith:同startswith,忽略大小写。

    # endswith:同startswith,以什么结尾。
    # iendswith:同istartswith,以什么结尾,忽略大小写。

    # in 成员所属:
    rs = User.objects.filter(age__in=[18, 19, 20])

    # gt 大于:
    rs = User.objects.filter(age__gt=20)
    # gte 大于等于:
    rs = User.objects.filter(age__gte=20)
    # lt 小于:
    rs = User.objects.filter(age__lt=20)
    # lte 小于等于:
    rs = User.objects.filter(age__lte=20)
    # range 区间:
    rs = User.objects.filter(age__range=(18, 20))

    # isnull 判断是否为空:
    rs = User.objects.filter(country__isnull=True)

    # 切片:
    rs = User.objects.all()[:2]
    # 注意: 不能使用负数作为切片。

    # print(rs[0])   #QuerySet类型可以索引取值
    # print(list(rs[2:4])) # 可以切片
    print(rs)
    return HttpResponse('查询数据成功')

# QuerySet对象类型
"""
1.支持索引
2.支持切片,不支持负索引
3.可迭代对象
4.可通过list进行强行转换
"""

3.修改数据

在视图函数中导入User模型类,然后使用下面的方法更新数据

# blog/views.py
def update_user(request):
    # F1 先查找到对象,对属性重新赋值
    xps = User.objects.get(name='xps')
    xps.name = "XPS"
    xps.save()
    # F2
    User.objects.filter(id=2).update(name='xxx') # 这种方法不用save了
    User.objects.all().update(age=10)
    return HttpResponse('更新数据成功')

4.删除数据

def delete_user(request):
    # User.objects.get(id=4).delete()
    rs = User.objects.all()
    print(dir(rs)) # 可以查看有没有这个属性
    User.objects.filter(name='xps3').delete()

    return HttpResponse('删除数据成功')