小白学习django第四站-关联数据库
使用mysql连接django首先要配置好相关环境
首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库)

在setting.py那个目录的__init__.py文件中写入

之后就可以在app目录的models.py文件中编写django的模型类
from django.db import models # Create your models here.
# 1、创建模型类
# 表映射关系 模型类 == 表 属性 == 字段 class User(models.Model):
id = models.AutoField(primary_key=True) # 自增长主键列,默认的
name = models.CharField(max_length=30)
city = models.CharField(max_length=30, default='beijing')
age = models.IntegerField(default=18) # 2、创建一个映射文件(迁移)
# python manage.py makemigrations [appanme]
# 3、 将映射文件的映射数据真正提交到数据库(迁移)
# python manage.py migrate [appname]
def __str__(self):
return 'id=%s, name=%s, city=%s, age=%s' % (self.id, self.name, self.city, self.age)
然后点击

在下面命令行输入
makemigrations [appname] 这个是用来创建映射文件的
在输入
migrate [appname] 这个是将映射数据提交到数据库中
这样数据库中表就建立好了
之后就可以编写增删改查操作了
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from .models import User def add(request):
# # 方法一
# mr = User(name='xuning', city='beijing')
# mr.save() # 保存提交 # 方法二
# mr = User()
# mr.name = 'test1'
# mr.city = 'chengdu'
# mr.save() # 方法三
# User.objects.create(name='test2', city='辽宁')
# User.objects.create(name='test3', city='铁岭') # 方法四
# User.objects.get_or_create(name='test4', city='北京') # 判断你有没有重复的数据 return HttpResponse('添加成功') def select(request):
# 查询所有对象
# rs = User.objects.all()
# print(rs[0]) # 查询单个对象
# rs = User.objects.get(city='长春') # 查询满足条件的对象
# rs = User.objects.filter(name='xuning' or 'test1')
# return HttpResponse('查询成功') # 查询第一条数据
# rs = User.objects.first()
# 查询最后一条数据
# rs = User.objects.last()
# 查询不满足条件的
# rs = User.objects.exclude(name='test2')
# 对于查询结果进行排序
# 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.all().count() # 查询条件
# 相当于等于
# rs = User.objects.filter(name__exact='test3') # 不区分大小写
# 包含,模糊查询
# rs = User.objects.filter(name__contains='test')
# 以什么开头
# rs = User.objects.filter(name__istartswith='t')
# 以什么结尾
# rs = User.objects.filter(name__iendswith='4')
# 成员所属
# rs = User.objects.filter(age__in=[3, 18, 20])
# rs = User.objects.filter(id__in=[3, 4, 5])
# 大于 大于等于 小于 小于等于
# rs = User.objects.filter(age__lte=18)
# 区间
# rs = User.objects.filter(age__range=(2, 18))
# 切片
rs = User.objects.all()[0:3]
# rs = User.objects.filter(name__contains='tes') & User.objects.filter(id=2)
return render(request, 'db_index.html', context={'rs': rs}) def update(request):
# rs = Dog.objects.get(id=2)
# print(rs)
# rs.name = 'test'
# rs.age = 20
# rs.save() # User.objects.filter(name='test1').update(city='长春')
# User.objects.all().update(city='长春')
# User.objects.filter(id=5).update(name='test5')
# User.objects.filter(id=6).update(name='test6')
# Dog.objects.filter(name='test1').update(age=30) # Course.objects.filter(c_id=1).update(c_name='python')
return HttpResponse('修改成功') def delete(request):
# User.objects.get(name='test').delete()
# Student.objects.all().delete()
# Stu_detail.objects.all().delete()
# Department.objects.all().delete()
# Course.objects.all().delete() return HttpResponse('删除成功')
变关系的实现(一对多, 一对一, 多对多)
先建立表模型
from django.db import models
class Department(models.Model):
d_id = models.AutoField(primary_key=True)
d_name = models.CharField(max_length=30) def __str__(self):
return f'Department<d_id={self.d_id}, d_name={self.d_name}>' class Student(models.Model):
s_id = models.AutoField(primary_key=True)
s_name = models.CharField(max_length=30)
department = models.ForeignKey('Department', on_delete=models.CASCADE, null=True) # 级联删除
# department = models.ForeignKey('Department', on_delete=models.SET_NULL, null=True) # 级联删除
# department = models.ForeignKey('Department', on_delete=models.PROTECT, null=True) # 级联删除
# course = models.ManyToManyField('Course') def __str__(self):
return f'Student<s_id={self.s_id}, s_name={self.s_name}>' class Course(models.Model):
c_id = models.AutoField(primary_key=True)
c_name = models.CharField(max_length=30)
student = models.ManyToManyField('Student') def __str__(self):
return f'Course<c_id={self.c_id}, c_name={self.c_name}>' class Stu_detail(models.Model):
# s_id = models.OneToOneField('Student', on_delete=models.CASCADE)
student = models.OneToOneField('Student', on_delete=models.CASCADE)
age = models.IntegerField()
gender = models.BooleanField(default=1)
city = models.CharField(max_length=30, null=True) def __str__(self):
return f'Stu_detail<s_id={self.student}, age={self.age}, gender={self.gender}, city={self.city}>' # 级联删除 保证数据的完整性与一致性
# on_delete=models.CASCADE 删除主键同时删除外键数据
# on_delete=models.SET_NULL null=True 删除主键同时把外键设置为空
# on_delete=models.PROTECT 如果有外键正在引入主键, 那么主键不允许删除
之后对表关系进行操作
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from .models import User, Department, Student, Course, Stu_detail
def func2(request):
# # 为学院表添加数据
# Department.objects.get_or_create(d_name='软件')
# Department.objects.get_or_create(d_name='化学')
# Department.objects.get_or_create(d_name='物理')
# Department.objects.get_or_create(d_name='数学')
# Department.objects.get_or_create(d_name='语言')
# Department.objects.get_or_create(d_name='历史')
# # 为学生添加数据
# Student.objects.get_or_create(s_name='test1', department_id=1)
# Student.objects.get_or_create(s_name='test2', department_id=1)
# Student.objects.get_or_create(s_name='test3', department_id=1)
# Student.objects.get_or_create(s_name='test4', department_id=2)
# Student.objects.get_or_create(s_name='test5', department_id=2)
# Student.objects.get_or_create(s_name='test6', department_id=3)
# Student.objects.get_or_create(s_name='test7', department_id=4)
# Student.objects.get_or_create(s_name='test8', department_id=5)
# Student.objects.get_or_create(s_name='test9', department_id=6)
# # 为学生信息添加数据
# Stu_detail.objects.get_or_create(age=18, gender=1, city='上海', student_id=1)
# Stu_detail.objects.get_or_create(age=17, gender=0, city='武汉', student_id=2)
# Stu_detail.objects.get_or_create(age=18, gender=1, city='长沙', student_id=3)
# Stu_detail.objects.get_or_create(age=19, gender=1, city='北京', student_id=4)
# Stu_detail.objects.get_or_create(age=16, gender=1, city='长春', student_id=5)
# Stu_detail.objects.get_or_create(age=17, gender=0, city='铁岭', student_id=6)
# Stu_detail.objects.get_or_create(age=18, gender=1, city='南京', student_id=7)
# Stu_detail.objects.get_or_create(age=16, gender=0, city='天津', student_id=8)
# Stu_detail.objects.get_or_create(age=17, gender=1, city='西安', student_id=9)
# # 为课程添加信息
# Course.objects.get_or_create(c_name='pyhton')
# Course.objects.get_or_create(c_name='c++')
# Course.objects.get_or_create(c_name='php')
# Course.objects.get_or_create(c_name='java')
# Course.objects.get_or_create(c_name='go')
# Course.objects.get_or_create(c_name='r') # 一对多操作
d1 = Department.objects.get(d_id=1)
d2 = Department.objects.get(d_id=2)
d3 = Department.objects.get(d_id=3)
s1 = Student.objects.get(s_id=1)
s2 = Student.objects.get(s_id=2)
s3 = Student.objects.get(s_id=3)
s7 = Student.objects.get(s_id=7)
# add方法
# 将学生s_id2添加到学院d_id2中
# d2.student_set.add(s2)
# d1.student_set.add(s7)
# create方法
# 新建学生test10,加入d_id1中
# d1.student_set.create(s_name='test10')
# 查询
# print(s1.department.d_name)
# print(s1.department.d_id)
# print(d1.student_set.all())
# print(d1.student_set.filter(s_id=1))
# print(d1.student_set.get(s_id=3))
# 删除
# d1.student_set.remove(s3)
# d2.student_set.clear() # 一对一操作
# stu = Stu_detail.objects.get(id=1)
# print(stu.student.s_name)
# print(s1.stu_detail.city) # 多对多操作
c1 = Course.objects.get(c_id=1)
c2 = Course.objects.get(c_id=2)
c3 = Course.objects.get(c_id=3)
c4 = Course.objects.get(c_id=4) s6 = Student.objects.get(s_id=6)
s7 = Student.objects.get(s_id=7)
s8 = Student.objects.get(s_id=8)
s9 = Student.objects.get(s_id=9)
# 添加
# c1.student.add(s6, s7)
# s8.course_set.add(c2, c4)
# s9.course_set.add(c1, c3)
# 查询
# print(s6.course_set.all())
# print(s7.course_set.get(c_id=1))
# print(c2.student.all())
# print(c3.student.get(s_id=9))
# 删除
# s6.course_set.remove(c1)
# c4.student.clear()
# c3.student.remove(s9) # 多表联查
# 查询报名了python的学生的学生信息
# rs = Stu_detail.objects.filter(student__course__c_name='python')
# rs = Stu_detail.objects.filter(student__course__c_id=1)
# 学生名字包含test1的学院信息
# rs = Department.objects.filter(student__s_name__contains='test')
# 软件学院报名了python的学员的详细信息
# rs = Stu_detail.objects.filter(student__department__d_name='软件', student__course__c_name='python')
# print(rs) return HttpResponse('执行成功')
小白学习django第四站-关联数据库的更多相关文章
- 小白学习django第六站-http相关
请求与相应 HttpRequest对象API def home(request): print('path:', request.path) print('mothod:', request.meth ...
- 小白学习django第五站-简易案例
首先在setting.py文件中编写数据库配置内容 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': ' ...
- 小白学习django第三站-自定义过滤器及标签
要使用自定义过滤器和标签,首先要设置好目录结构 现在项目目录下建立common的python包 再将common加入到setting.py中的INSTALLED_APP列表中 在common创建目录t ...
- 小白学习django第一站-环境配置
Django简单来说就是用Python开发的一个免费开源的Web框架 使用Django,使你能够以最小的代价构建和维护高质量的Web应用. 开搞!!! 工具准备: linux(ubuntu) + py ...
- Django基础四(model和数据库)
上一篇博文学习了Django的form和template.到目前为止,我们所涉及的内容都是怎么利用Django在浏览器页面上显示内容.WEB开发除了数据的显示之外,还有数据的存储,本文的内容就是如何在 ...
- 小白学习django第二站-模版配置
上一站说道app创建,接下来我们来配置app的url路由 首先需要到setting.py中添加book这个app, 再到django_test文件里的urls添加路由 include() : 这个函数 ...
- 小白学习Spark系列四:RDD踩坑总结(scala+spark2.1 sql常用方法)
初次尝试用 Spark+scala 完成项目的重构,由于两者之前都没接触过,所以边学边用的过程大多艰难.首先面临的是如何快速上手,然后是代码调优.性能调优.本章主要记录自己在项目中遇到的问题以及解决方 ...
- Mysql学习笔记(四)聊聊数据库索引
小心情(可直接跳到分割线后) 今天心情好些了.一些浓的化不开的坏情绪,也渐渐的在晚上解决掉一个复杂的逻辑问题后,渐渐消散了. 今天中午去吃饭的时候,坤哥漫不经心的说:'我这么多年终于悟出了一个道理,人 ...
- sqlserver -- 学习笔记(四)将一个数据库的表复制到另外一个数据库(备忘)
--复制结构+数据 select * into 数据库名.dbo.新表名 from 数据库名.dbo.原表名 select * into Stockholder.dbo.SHInfo from dsp ...
随机推荐
- Java线程之Timer
简述 java.util.Timer是一个定时器,用来调度线程在某个时间执行.在初始化Timer时,开启一个线程循环提取TaskQueue任务数组中的任务, 如果任务数组为空,线程等待直到添加任务: ...
- LNMP源码编译
LNMP源码编译 编译安装之前把开发包组安装了 [root@tiandong63 ~]# yum groupinstall "Development Tools" "De ...
- python3爬取拉钩招聘数据
使用python爬去拉钩数据 第一步:下载所需模块 requests 进入cmd命令 :pip install requests 回车 联网自动下载 xlwt 进入cmd命令 :pip install ...
- MERGE INTO 解决大数据量复杂操作更新慢的问题
现我系统中有一条复杂SQL,由于业务复杂需要关联人员的工作离职三个表,并进行分支判断,再计算人员的字段信息,由于人员多,分支多,计算复杂等原因,一次执行需要5min,容易卡死,现在使用MERGE IN ...
- Mac平台最好用的万能开源免费播放器-IINA
1.安装 1)官网下载地址 https://iina.io/ 2)brew 方式安装 testdeMacBook-Pro:~ test$ brew cask install iina Updating ...
- mvp解读
mvp存在的问题 1.业务复杂时,可能使得Activity变成更加复杂,比如要实现N个IView,然后写更多个模版方法. 2.业务复杂时,各个角色之间通信会变得很冗长和复杂,回调链过长. 3.Pres ...
- oracle设置默认值无效
一次做农行的项目,在向一个表插入数据时我们要求插入字符类型的操作日期和时间,我们这边当时采取的是给日期和时间字段设置默认值的方法:下面我简单还原一下当时的表结构 -- Create table cre ...
- Android studio2 中的 SDK Manager的使用-------Android SDK 的安装与更新(Install missing platform(s) and sync project 编译错误解决)
最近在编写Android程序,其中有一个问题就是对旧应用的导入,此时往往你的Android SDK中并没有老版本的Android SDK, 此时往往会提示你出现错误 Install missing p ...
- pandas基础,Serires,Dataframe
DataFrame DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值.字符串.布尔型等),DataFrame即有行索引也有列索引,可以被看做是 ...
- 八十三:redis之redis的字符串、过期时间、列表操作
字符串操作 设置值 set key value 设置有空格的值,加引号 set username 'hello world' 获取值 get key 删除值:del key 清除所有内容:flusha ...