小白学习django第四站-关联数据库

时间:2021-09-02 13:31:36

使用mysql连接django首先要配置好相关环境

首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库)

小白学习django第四站-关联数据库

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

小白学习django第四站-关联数据库

之后就可以在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)

然后点击

小白学习django第四站-关联数据库

在下面命令行输入

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('执行成功')