Django下mysql数据库的相关操作(创建数据表、以及增删查改)

2022-07-18 09:28:32

如有疑惑或错误之处可评论或邮箱联系博主:xuwang.me@gmail.com

本文主要记录了在django下使用mysql数据库时的相关操作,包括创建数据库、数据表、以及增删查改。
博主开发环境:Ubuntu16.04,python2.7,django1.11,mysql5.7

  • 数据库(database)创建
  • 数据表(table)创建
  • 数据库的增删查改四个基本操作

本文采用的数据模型

假设我们以某校学生信息例,针对其数据存储创建一个简单的数据模型:
学生信息的存储进行分学院存储,例如计算机学院,电子工程学院等等。该部分我们对应College模型,有字段学院名name, 描述description(学院信息的相关介绍), 管理人员manager。
在每个学院中细分为各个专业。对应模型Major,有字段专业名name, 外键College(College与Major为一对多关系)。
在每个班级中,存储每个学生的个人信息。对应Student模型,有字段学生姓名name, 学号student_id, 外键Major(Major与Student为一对多关系)。



1. 数据库student_info的创建

在电脑上安装完mysql数据库的前提下,我们使用sql语句创建student_info数据库

CREATEDATABASE student_info

2. 数据表的创建

自定义table名字方法:
为节省你的时间,Django 会根据模型类的名称和包含它的应用的名称自动指定数据库表名称。一个模型的数据库表名称,由这个模型的“应用标签”(在manage.py startapp中使用的名称)和模型类名称之间加上下划线组成。
举个例子, bookstore应用(使用 manage.py startapp bookstore 创建),里面有个名为 Book的模型,那数据表的名称就是 bookstore_book 。

我们也可以使用 Meta类中的 db_table 参数来重写数据表的名称。
在 MySQL中使用小写字母为表命名
当你通过db_table覆写表名称时,强烈推荐使用小写字母给表命名,特别是如果你用了MySQL作为后端。详见MySQL注意事项 。

在这里我们展示自己为数据表命名的代码块:

from __future__import unicode_literalsfrom django.dbimport modelsclassTest(models.Model):
    name = models.CharField(max_length=20, primary_key=True)#primary_key=True表示个自定义主键字段,只要在某个字段上制定primary_key=True#如果 Django 看到你显式地设置了 Field.primary_key,就不会自动添加 id 列。#max_length表示允许输入的最大字符个数classMeta:
        db_table ="self_table_name"

相关说明:
每个字段有一些特有的参数。例如,CharField(和它的派生类)需要max_length 参数来指定VARCHAR 数据库字段的大小。
还有一些适用于所有字段的通用参数。 这些参数在参考中有详细定义,这里我们只简单介绍一些最常用的:
null
如果为True,Django 将会把数据库中空值保存为NULL。默认值是 False.
blank
如果为True,该字段允许为空值,默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴,指数据库中字段内容是否允许为空,而 blank 是表单数据输入验证范畴的。如果一个字段的blank=True,表单的验证将允许输入一个空值。如果字段的blank=False,该字段就是必填的。

针对本文所采用的数据模型创建三个数据表:
代码块如下:

from __future__import unicode_literalsfrom django.dbimport modelsfrom django.contrib.auth.modelsimport UserclassCollege(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=100)
    manager = models.ForeignKey(User, blank=True, null=True)def__str__(self):return self.nameclassMajor(models.Model):
    name = models.CharField(max_length=30)
    colleage= models.ForeignKey(College, on_delete=models.CASCADE, related_name='majors')def__str__(self):return self.nameclassStudent(models.Model):
    name = models.CharField(max_length=30)
    student_id = models.IntegerField()
    major = models.ForeignKey(Major, on_delete=models.CASCADE)def__str__(self):return self.name

相关说明:

  1. 外键ForeignKey()
    在模型中定义外键时,同步数据库后,django默认在外键字段名后加上”_id”作为数据库表的列名。
    ForeignKey()相关参数如下:
    1.1 - - - - on_delete:
    当删除 “一” 模型对象时,django会根据该参数的值对与该对象相关联的其他对象(也就是 ‘多’)进行操作。
    默认为models.CASCADE 级联删除。当删除’一’时,‘多’会被删除。modles.PROTECT : 当删除一个具有外键关系的对象时,会引发一个异常,阻止删除该对象
    models.SET_NULL: 设置删除对象所关联的外键字段为null。但字段的null属性必需为True
    models.SET_DEFAULT : 设置删除对象所关联的外键字段为默认的值。
    models.SET(value) :设置删除对象所关联的对象的外键字段为value,value也可以是一个可调用函数。
    1.2 - - - - related_name
    反向查询: 如我们在Major模型的外键major字段中设置realted_name=’majors’,可以在关系的另一端,即College端反向查询到Major

注意:每一次修改模型后,我们都需要确保运行manage.py makemigrations 给应用生成迁移脚本,并接着运行manage.py migrate


3. 数据库的增删查改四个基本操作

增加

from django.httpimport HttpResponsefrom testModel.modelsimport Test# 添加数据defdbInsert(request):
  test1 = Test(name='insert context')
  test1.save()return HttpResponse("<p>数据添加成功!</p>")

删除

from django.httpimport HttpResponsefrom testModel.modelsimport Test# 删除数据defdbDelete(request):# 删除id=1的数据
    test1 = Test.objects.get(id=1)
    test1.delete()# 另外一种方式# Test.objects.filter(id=1).delete()# 删除所有数据# Test.objects.all().delete()return HttpResponse("<p>删除成功</p>")

查找

from django.httpimport HttpResponsefrom testModel.modelsimport Test#获取数据defdbGet(request):# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
    list = Test.objects.all()#  filter相当于SQL中的WHERE,可设置条件过滤结果
    response2 = Test.objects.filter(id=1)# 获取单个对象
    response3 = Test.objects.get(id=1)# 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    Test.objects.order_by('name')[0:2]# 数据排序
    Test.objects.order_by("id")# 上面的方法可以连锁使用
    Test.objects.filter(name="name context").order_by("id")# 输出所有数据for varin list:
        response1 += var.name +" "
        response = response1return HttpResponse("<p>" + response +"</p>")

修改

from django.httpimport HttpResponsefrom testModel.modelsimport Test# 更改数据defdbUpdate(request):# 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
    test1 = Test.objects.get(id=2)
    test1.name ='name_update'
    test1.save()# 另外一种方式# Test.objects.filter(id=1).update(name='name_update')# 修改所有的列# Test.objects.all().update(name='name_update')return HttpResponse("<p>修改成功</p>")
  • 作者:febrywang
  • 原文链接:https://blog.csdn.net/smileZenvo/article/details/76403114
    更新时间:2022-07-18 09:28:32