Django 之 MySQL基本操作

Django 模型(数据库)

Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3,PostgreSQL、MySQL、SQLite、Oracle。等数据库,使用对应的数据库只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。

MySQL 是 Web 应用中最常用的数据库,,接下来对MySQL的使用进行介绍,如果没有安装mysql 驱动,可以执行以下命令安装:

pip install mysqlclient

数据库配置

对MySQL的配置只需要在项目文件夹下的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'user',
        'USER': 'root',
        'PASSWORD': 'mysql',
        'HOST':'127.0.0.1',
        'PORT':'3306',
    }
}

上面的变量必须使用大写,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这里的设置,与 MySQL 中相应的数据库和用户连接起来。

在Django中是默认使用mysqldb模块连接数据库的,这时候要用pymysql模块来替换mysqldb连接数库,有两种方式:
方式一:在项目名文件夹下面的__ init __ .py
方式二:在app应用文件夹下面的__ init __ .py

固定写法:


import pymysql
pymysql.install_as_MySQLdb()  # 告诉django用pymysql代替mysqldb连接数据库

创建模型

要想使用模型必须要创建app应用,创建好app后就可以在app文件夹下的models.py定义模型。

from django.db import models
class User(models.Model):
    # user表的主键字段名就是id,id字段可以不写默认会帮你创建一个主键id字段
    id = models.AutoField(primary_key=True)
    # varchar(32) name字段是varchar(32)   CharField在定义的时候必须要加max_length参数
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=16)

    def __str__(self):
        return self.name

以上的类名代表了数据库中的一张表,且继承了models.Model,类里面的属性代表数据表中的字段(name),数据类型则有CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

常用字段类型

以下列表描述了一些更常用的字段类型。

  • CharField: 是用来定义短到中等长度的字段字符串。你必须指定max_length要存储的数据。
  • TextField:用于大型任意长度的字符串。你可以max_length为该字段指定一个字段,但仅当该字段以表单显示时才会使用(不会在数据库级别强制执行)。
  • IntegerField:是一个用于存储整数(整数)值的字段,用于在表单中验证输入的值为整数。
  • DateField 和 DateTimeField:用于存储/表示日期和日期/时间信息(分别是Python.datetime.date和datetime.datetime对象。这些字段可以另外表明(互斥)参数auto_now=Ture (在每次保存模型时将该字段设置为当前日期),auto_now_add(仅设置模型首次创建时的日期)和default(设置默认日期,可以被用户覆盖)。
  • EmailField:用于存储和验证电子邮件地址。
  • FileField 和 ImageField:分别用于上传文件和图像(ImageField 只需添加上传的文件是图像的附加验证)。这些参数用于定义上传文件的存储方式和位置。
  • AutoField:是一种 IntegerField 自动递增的特殊类型。如果你没有明确指定一个主键,则此类型的主键将自动添加到模型中。
  • ForeignKey:用于指定与另一个数据库模型的一对多关系(例如,汽车有一个制造商,但制造商可以制作许多汽车)。关系的“一”侧是包含密钥的模型。
  • ManyToManyField: 用于指定 多对多关系(例如,一本书可以有几种类型,每种类型可以包含几本书)。在我们的图书馆应用程序中,我们将非常类似地使用它们ForeignKeys,但是可以用更复杂的方式来描述组之间的关系。这些具有参数on_delete来定义关联记录被删除时会发生什么(例如,值models.SET_NULL将简单地设置为值NULL)。

创建数据表

接下来建创建的模型同步到数据库中形成表结构。先 cd进入 manage.py 所在的那个文件夹下,输入下面的命令:

python manage.py makemigrations  # 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate  # 创建表结构,将你的数据模型变动正在同步到数据库中

在操作上面的命令签要确保app应用已经在settings中注册。

数据库操作

添加数据

在app应用文件夹下的views.py中添加增加数据的函数来操作数据库。添加数据有以下几种方式:

方式一:通过create函数进行直接进行添加
user_obj = models.User.objects.create(name='linwow',password='123')
方式二:通过对象调用save()来添加
user_obj = models.User(name='linwow',password='123')
user_obj.save()  # 对象调用save方法保存到数据库
方式三:
user_obj = models.User()
user_obj.name = 'linwow'
user_obj.password = '123'
user_obj.save()
方式四:首先尝试获取,不存在就创建,可以防止重复
models.User.objects.get_or_create(name='linwow', password='123')
# 返回的是一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False
  • 当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来
user_obj = models.User.objects.get(pk=1)
class_obj = models.Class.objects.get(name="python")
user_obj.cla_id = class_obj
user_obj.save()

获取数据

Django提供了多种方式来获取数据库的内容,从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet。查询数据需要注意的是你获取到的到底是一个queryset还是一个数据对象

  • all():通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM user
user_list = models.User.objects.all()  # 获取user表所有的数据
这样获取到的是QuerySet对象,只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句
print(user_list.query) 
  • filter():filter相当于SQL中的WHERE,可设置条件过滤结果,filter当条件不存在的情况下会返回一个空的queryset对象
user_list = models.User.objects.filter(id=1) # 获取user表中id为1的数据
queryset对象支持索引取值 但是不推荐你使用  推荐使用自带的.first()获取第一条数据
user_query = models.User.objects.filter(name=linwow).first()
  • get() :获取单个对象,用get可以直接获取到数据对象本身但是查询条件不存在的情况下直接报错
user_list = models.User.objects.get(id=1) # 如果数据不存在会报错,一般不推荐使用

获取数据方法总结:

获取所有数据:
models.User.objects.all()
切片操作,获取10个人,不支持负索引,切片可以节约内存:
models.User.objects.all()[:10] 
获取对应条件的值,get是用来获取一个对象的:
models.User.objects.get(name=name)
获取满足条件的一些人,就要用到filter:
models.User.objects.filter(name="abc")  # 等于models.User.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
models.User.objects.filter(name__iexact="abc")
名称中包含 "abc"的人:
models.User.objects.filter(name__contains="abc")
名称中包含 "abc",且abc不区分大小写:
models.User.objects.filter(name__icontains="abc")

正则表达式查询:
models.User.objects.filter(name__regex="^abc")
正则表达式不区分大小写:
models.User.objects.filter(name__iregex="^abc")

排除包含wow的User对象:
models.User.objects.exclude(name__contains="wow")
找出名称含有abc, 但是排除年龄是23岁的
models.User.objects.filter(name__contains="abc").exclude(age=23)

1、如果只是检查User中是否有对象,应该用 user_list = models.User.objects.all().exists()
2、用 len(user_list) 可以得到User的数量,但是推荐用 models.User.objects.count()来查询数量。
3list(user_list) 可以强行将 QuerySet 变成列表。
4、 去重方法user_list = user_list.distinct()

defer 排除不需要的字段

在复杂的情况下,表中可能有些字段内容非常多,取出来转化成 Python 对象会占用大量的资源,这时候可以用 defer 来排除这些字段。

models.User.objects.all().defer('addr')

only 仅选择需要的字段

和 defer 相反,only 用于取出需要的字段,假如只需要查出用户名。

models.User.objects.all().only('addr')

更新数据

修改数据可以使用 save() 或 update(),save()的使用方法和新增数据是一样的,下面介绍update的使用方法。

  • 批量更新,适用于 .all() .filter() .exclude() 等后面 。
  • 单个 object 更新,适合于 .get(), get_or_create(), update_or_create() 等得到的 obj。
models.User.objects.filter(id=1).update(name='lin',password='321')

删除数据

删除数据库中的对象只需调用该对象的delete()方法即可

  • 删除id=1的数据
user_obj = models.User.objects.get(id=1)
test1.delete()
或者
models.User.objects.filter(id=1).delete()
  • 删除所有数据
models.User.objects.all().delete()

数据排序

在 Django 应用中,如果希望根据某字段的值对检索结果排序,比如说,按字母顺序。 那么,使用order_by() 这个方法就可以了。

  • 可以对任意字段进行排序:
models.User.objects.all().order_by('name')
  • 如果需要以多个字段为标准进行排序(第二个字段会在第一个字段的值相同的情况下被使用到),使用多个参数就可以:
models.User.objects.all().order_by('name','id')
  • 可以指定逆向排序,在前面加一个减号 - 前缀:
models.User.objects.all().order_by('-name')

猜你喜欢

转载自blog.csdn.net/linwow/article/details/91351022