django -数据库操作
转载:https://www.cnblogs.com/rinka/p/django_database_basic_operations.html
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()
django -数据库操作相关推荐
- Django-- (三) Django数据库操作
1.Django数据库 Django 非常适合构建数据库驱动型网站,它提供了简单而强大的工具(ORM),易于使用 Python 执行数据库查询. 2.ORM介绍 Object Relational M ...
- django数据库操作和中间件
数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...
- Django数据库操作查询
文章目录 Django数据库操纵查询 F和Q对象: 1.F对象: 2.Q对象: 2.聚合函数和排序函数 1.聚合函数: 2.排序函数: 3.级联查询: 1.关联查询 关联过滤查询 4.查询集 **查询 ...
- Django数据库操作(MySQL+Djan)
1.mySQL 使用 pymysql 安装 pip install pymysql 配置 引入pymysql 并将pymysql 设置为 mysql的使用方式 2.设置 settings.py 文件修 ...
- phalapi 数据库锁_phalApi数据库操作
在很多时候,我们会遇到数据库表里面的某个值需要+1操作,我们不能简单地在update的时候写入array('key' => 'key+1'),因为在解析sql的时候,key+1 会带上引号作为一 ...
- Django模型之数据库操作-查询
六.数据库操作-查询 6.1基础条件查询 1 基本查询 get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常. all查询多个结果.[返回的所有结果是列表] count查询结果数量 ...
- Django与数据库操作
Django与数据库操作 数据库连接的方法 web 框架 django --- 自己内部实现 (ORM) + pymysql(连接)Flask,tornado ---pymysqlSQLArchemy ...
- Django从理论到实战(part31)--Django数据库查询操作
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: Django数据库查询操作 查找是数据库操作中一个非常重要的技术,查询一般就是使用filter.exclude以及get三个 ...
- Django从理论到实战(part25)--数据库操作
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...
- 关于Django中的数据库操作API之distinct去重的一个误传
django提供的数据库操作API中的distinct()函数,了解SQL语句的读者都应该知道,DISTINCT关键字可以在select操作时去重.django里的这个distinct()函数也是这个 ...
最新文章
- C语言网络编程:accept函数详解
- cf792b循环链表
- 使用OpenCV和Dlib的头部姿态估计
- 人体姿态估计--Learning Feature Pyramids for Human Pose Estimation
- 第五周 1 素数和(5分)
- Binary Tree Inorder Traversal
- 谓词NSPredicate的使用
- 平面点集的最小包围圆 hdu 3932
- 专科计算机网络期末考试,计算机网络(专科)期末练习题.doc
- [pytorch、学习] - 3.7 softmax回归的简洁实现
- (转载) linux安装JDK
- 如何在scope图中标注_电机学习笔记: 变压器初级(原边)和次级(副边)的感应电动势、电压方向如何标注?...
- php 输入经纬度查询位置,PHP根据一个给定经纬度的点,进行附近地点查询
- 【斯坦福大学公开课】Stanford NLP: Lesson 1 Intro
- Wangle中EchoClient分析
- python中的matplotlib用法
- 【C语言】N 阶矩阵的转置
- Java的字符串连接符(+)
- 图像区分平坦区域、边缘、角点区域
- 移植中文TTS(ekho)到ARM linux开发板
热门文章
- js 禁止鼠标菜单键及键盘快捷键
- groovy简单介绍
- 由pushViewController说起可能出线的各种死法
- java 12306验证码识别_12306验证码图片库大全
- psm倾向得分匹配法举例_倾向得分匹配(PSM)操作过程与问题反思
- 【波形发生器(附源码)】基于DAC+DMA+UART的幅值、频率可调的正弦波、方波、三角波发生器
- python 年月日转换日期_python 二〇二〇年九月二十四日 汉字日期转化为数字日期...
- 如何使用plink进行二分类性状的GWAS分析并计算PRS得分
- C# 将raw格式的二进制灰度图像转为正常位图格式
- mac上安装linux双系统,怎么在台式一体机上安装双系统?