os:mac, django1.9.5,  python3.5

database:mysql

0.背景

django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。

方便的是,django可以自动生成这些create table, alter table, drop table的操作。

想想看,如果我们每次修改django中的数据模型,又要去同步修改数据库中的模型,是多么麻烦的一件事。更不用说那些容易发生的细节上的错误了。

1.创建模型

假设我们为一个shopping mall创建一个简单的数据模型:

商场里分各个区域,如化妆品区,女装区,男装区等等。对应Area模型,有字段区域名name, 描述description, 管理人员manager。

接着,在每个区域中又有许多商铺。对应Store模型,有字段商铺名name, 外键area(Area与Store为一对多关系)。

而每个商铺里,贩卖各种商品。对应Item模型,有字段商品名name, 价格price, 外键store(Store与Item为一对多关系)。

 1 from django.db import models
 2 from django.contrib.auth.models import User
 3
 4
 5 class Area(models.Model):
 6     name = models.CharField(max_length=30)
 7     description = models.CharField(max_length=100)
 8     manager = models.ForeignKey(User, blank=True, null=True)
 9
10     def __str__(self):
11         return self.name
12
13
14 class Store(models.Model):
15     name = models.CharField(max_length=30)
16     area = models.ForeignKey(Area, on_delete=models.CASCADE, related_name='stores')
17
18     def __str__(self):
19         return self.name
20
21
22 class Item(models.Model):
23     name = models.CharField(max_length=30)
24     price = models.IntegerField()
25     store = models.ForeignKey(Store, on_delete=models.CASCADE)
26
27     def __str__(self):
28         return self.name

1.1 主键

我们注意到,在上面定义model时,我们并没有定义主键primary key。这是因为除非你显式指定,django会自动为你的模型增加一个字段名为id的主键。

id = models.AutoField(primary_key=True)

当然,我们也可以自定义主键,只要给字段设置primary_key=True就可以。这时候,django就不会自动为我们的模型设置id主键了。

primary_key=True意味着null=False 以及unique=True。也就是说,主键是非空且独一无二的,它是用来在这个表中标识这一行数据的。

在django的模型中,主键也是只读的。

1.2 外键

在模型中定义外键时,同步数据库后,django默认在外键字段名后加上"_id"作为数据库表的列名。

ForeignKey()常用的额外参数如下:

级联删除: on_delete=models.CASCADE

反向查询: 如我们在Store模型的外键store字段中设置realted_name='stores',可以在关系的另一端,即area端反向查询到stores

1.3 __str__()方法

给每个模型定义__str__()方法是一个很好的做法,这不只是为了交互时方便,也是因为django会在其他一些地方用 __str__() 来显示对象。

注意__str__()方法必须返回字符串。

2.生成模型

每一次对model的修改,都需要运行以下两条命令来同步我们的数据库:

1 python manage.py makemigrations
2 python manage.py migrate

2.1 makemigrations

其中第一条命令的作用是生成migrations文件。

在我们的例子中,makemigrations后shell中会有以下输出:

1 Migrations for 'shop':
2   0001_initial.py:
3     - Create model Area
4     - Create model Store
5     - Create model Item

而这时候,在我们的app shop中能看到一个migrations文件夹,打开0001_initial.py,就能看到对应的migration语句。

2.2 migrate

而第二条命令的作用是将这些migrations应用到数据库上去。

在我们的例子中,migrate后shell中会有以下输出:

1 Operations to perform:
2   Apply all migrations: silk, sessions, admin, auth, shop, contenttypes
3 Running migrations:
4   Rendering model states... DONE
5   Applying shop.0001_initial... OK

自动生成的表名为app名(shop)和模型的小写名称(area, store, item)的组合(用下划线_组合)。如在app shop下的模型Area对应数据库中的shop_area表。

2.3 说明

每个app的migration文件都会在app中的migrations文件夹下被生成。

在django中,每一次对模型以及模型中的字段的增加,删除或修改,都会在执行python manage.py makemigrations后生成相应的migrations。

建议仔细检查makemigrations后shell中的输出,尤其是在对模型进行了复杂的改变时。检查完毕后再执行migrate。

当然,如果你在运行makemigrations后反悔了,大可以不执行migrate,而是转去删除刚刚生成的migrations文件。

everyone deserves a second chance:)

3.数据库的基本操作

3.1 增

我们先为shopping mall增加一个化妆品区:

1 from django.shortcuts import HttpResponse
2 from .models import Area
3
4
5 def add_area(request):
6     area = Area.objects.create(name='cosmetic', description='充满香味儿的区域')
7
8     return HttpResponse('added!')

其中,第六行代码 area = Area.objects.create(name='cosmetic', description='充满香味儿的区域')

所对应的mysql语句为:

insert into shop_area(name,description) values('cosmetic','充满香味儿的区域');

3.2 查

现在,我们来列出shopping mall中的所有区域:

1 from django.shortcuts import HttpResponse
2 from .models import Area
3
4
5 def list_area(request):
6     area = Area.objects.all()
7     print(area)                    # 在shell输出[<Area: 'cosmetic'>],如果没有定义__str__(),将输出无意义的[<Area: Area object>]
8
9     return HttpResponse('listed!')

第六行代码 area = Area.objects.all()

相当于mysql语句:

select * from shop_area;

复习一下:shop_area为django为模型自动生成的表名(app_model)

3.3 改

在3.1中,我们并没有为化妆品区指定管理人员。现在,我们修改化妆品区的信息,将rinka指定为管理人员。

首先,我们要创建一个rinka用户。这里我将创建一个名为rinka的superuser:

python manage.py createsuperuser

接着,将我们创建的rinka用户指定为化妆品区的管理人员:

 1 from django.shortcuts import HttpResponse
 2 from .models import Area
 3 from django.contrib.auth.models import User
 4
 5
 6 def update_area(request):
 7     rinka = User.objects.get(username='rinka')
 8     area = Area.objects.get(id=1)
 9     area.manager = rinka
10     area.save()
11
12     return HttpResponse('updated!')

注意必须调用对象的save()方法,对对象实例的修改才会保存到数据库中去。这是一个容易出错的地方。

第8~10行代码对应的mysql语句为:

update shop_area set manager_id=1 where id=1;

复习一下:manager_id为django默认为外键生成的列名(foreignkey_id)

3.4删

删除操作很简单,我们现在来删除数据库表shop_area中id为1的那行数据:

1 from django.shortcuts import HttpResponse
2 from .models import Area
3
4
5 def delete_area(request):
6     area = Area.objects.get(id=1)
7     area.delete()
8
9     return HttpResponse('deleted!')

第6~7行语句对应的mysql语句为:

delete from shop_area where id=1;


总结

django中数据库基本操作:

1.同步数据库

python manage.py makemigrations  #生成migrations

python manage.py migrate   #应用migrations

2.增

Model.objects.create(**kwargs)

3.查

Model.objects.all()

4.改

m = Model.objects.get(id=1)

m.name = 'new_name'

m.save()

5.删

m = Model.objects.get(id=1)

m.delete()

转载于:https://www.cnblogs.com/rinka/p/django_database_basic_operations.html

django-数据库[ 基本操作 ]相关推荐

  1. python数据分析:数据库基本操作(SQLite)

    python数据分析:数据库基本操作(SQLite) SQLite: 关系型数据库管理系统 嵌入式数据库,适用于嵌入式设备 SQLite不是C/S的数据库引擎 集成在用户程序中 实现了大多数SQL标准 ...

  2. SQL Server数据库基本操作(一)

    SQL Server数据库基本操作 基本表的定义.删除与修改 1.创建基本表 2.修改基本表 3.删除基本表 基本表的定义.删除与修改 创建数据库 CREATE DATABASE STUDENT 1. ...

  3. [JSP暑假实训] 三.MySQL数据库基本操作及Servlet网站连接显示数据库信息

    本系列文章是作者暑假给学生进行实训分享的笔记,主要介绍MyEclipse环境下JSP网站开发,包括JAVA基础.网页布局.数据库基础.Servlet.前端后台数据库交互.DAO等知识. 前一篇文章讲解 ...

  4. mysql数据库基本操作总结与归纳

    mysql数据库基本操作总结与归纳 登录命令 mysql -u 用户名 -p 密码 列如: [root@localhost ~]# mysql -u root -p [root@localhost ~ ...

  5. Django从理论到实战(part31)--Django数据库查询操作

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: Django数据库查询操作 查找是数据库操作中一个非常重要的技术,查询一般就是使用filter.exclude以及get三个 ...

  6. 067:【Django数据库】ORM查询条件详解-range

    [Django数据库]ORM查询条件详解-range range: 判断某个 field 的值是否在给定的区间中.示例代码如下: # views.py文件内容:from datetime import ...

  7. Java数据库篇2——数据库基本操作

    Java数据库篇2--数据库基本操作 1.启动.停止.服务 net start mysql net stop mysql 2.登入登出 本地 Mysql -u用户名 -p密码Mysql -u用户名 - ...

  8. python基础课程3(看代码看注释)--数据库基本操作(mysql)

    #人生苦短,我用python #推荐一个python数据结构可视化工具,网址:http://www.pythontutor.com ##课表:1.mysql数据库的基本操作:2.用python操作基本 ...

  9. MySQL系列:数据库基本操作(1)

    1. 登录数据库 mysql -h localhost -u root -p 2. 数据库基本操作 2.1 查看数据库 mysql> SHOW DATABASES; +------------- ...

  10. 1Python全栈之路系列之MySQL数据库基本操作

    Python全栈之路系列之MySQL数据库基本操作 MySQL数据库介绍 MySQL是一种快速易用的关系型数据库管理系统(RDBMS),很多企业都在使用它来构建自己的数据库. MySQL由一家瑞典公司 ...

最新文章

  1. 机器学习基础专题:特征工程
  2. [你必须知道的.NET]第十三回:从Hello, world开始认识IL
  3. CVE-2021-40444 0 day漏洞利用
  4. csh for循环_shell中的for循环用法详解_linux shell
  5. Unable to lock JVM Memory: error=12--elasticsearch
  6. 2019年中国教育信息化行业研究报告
  7. 【简明笔记】循环条件的优化
  8. 前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite
  9. ElasticSearch High Level REST API【3】Scroll 滚屏
  10. php开发工具 知乎,一个微信小程序版知乎实例分享
  11. PC端哔哩哔哩动画下载的本地视频无法打开
  12. 云计算与大数据之间的关系
  13. 一寸照片制作—Photoshop学习(1)
  14. Blender建模练习:人物模型多边形建模流程图解(一核心布线篇)
  15. 解决spring源码构建时缺失spring-cglib-repack和spring-objenesis-repack问题
  16. 【网络安全】IP地址、子网掩码、网关、DNS、DHCP概述(自学,随时补充)
  17. 手机远程连接linux软件下载,远程连接linux服务器软件下载
  18. 感知器 - 西瓜好坏自动识别——python
  19. 【CF37E】 Trial for Chief
  20. 如何区分np.random.normal()、np.random.randn()、np.random.randint()、np.random.random()、np.random.choice()

热门文章

  1. Linux下dislocate命令用法,技术|在 Linux 中遨游手册页的海洋
  2. python抓取图片数字_从opencv python图像中提取数字
  3. python提取图片中的数字_用Python-OpenCV从车牌图像中提取数字和字母
  4. VM虚拟机安装Linux系统
  5. 用python暴力破解rar加密文件(经过测试)
  6. 配置disney的brdf项目全过程
  7. 关于killer网卡与win10 擦出火花 内存爆炸的原因
  8. 【镜像取证篇】VMware虚拟机配置文件取证
  9. 《千字文》 梁•周兴嗣
  10. 当我跑步时我在想什么读后感