虚拟环境只是虚拟的Python的文件和库,其他的是操作磁盘上的。
数据迁移
- 在开发中建议每次创建一个新的数据库
- 当使用旧库的时候,我们会发现成功实现迁移
- 导致出现问题原因
- 我们每次迁移都会生成一个迁移记录
- 迁移记录会在django_migrations表中记录,记录的关键词就是迁移文件名+应用名
- 修复,将迁移记录删除掉
F对象
- 实现一个模型中的两个字段的比较(一班和二班相比较)
- 模型中自己的字段进行一个运算
- F对象还支持基本的运算
# 获取女生比男生多的班级
def getGrade(request):
grades = Grade.gradeManager.filter(g_girl_num__gt=F("g_boy_num")+20)
context = {"grades":grades}
return render(request, 'Grades.html', context=context)
Q对象
- 条件的封装
- Q对象支持逻辑运算
- & (与 and)
- | (或 or)
- ~ (非 not ! )
def getStudentQ(request):
students = Student.objects.filter(s_age__gt=25).filter(s_age__lt=30)
# Q 对象支持逻辑 |(或) &(与) ~(非)
# students = Student.objects.filter(Q(s_age__gt=25) & Q(s_age__lt=30))
return render(request, "Students.html", context={"students": students})
一对一
绑定卡与人的一对一关系,默认情况下,当人被删除的情况下,与人绑定的卡就也删除了,这个可以使用on_delete进行调整
保护模式下,主表有内容,不能删除,没内容,可以删除
- 使用models.OneToOneField实现
- 这个字段在哪一个模型中都是可以使用的
- 使用了OneToOne的模型,默认它会随着绑定的数据而进行变化,绑定的数据被删除,它也会被删除
- 添加顺序
- OneToOne绑定的表是主表
- 使用OneToOne的是从表
- on_delete
- 默认CASECADE,默认从表数据跟随主表删除(比较暴力,容易出问题,开发中基本不用)
- PROTECT,保护默认,开发中常用(主表数据有从表数据的时候,主表是不能实现删除的)
- SETXXX 当删除,设置对应的字段值为YYY
- PROTECT保护的是主表数据
- SETXXX 设置的是从表
在模型中定义父类和子类,在子类中定义关系
id_person = models.OneToOneField(‘Person’,on_delete=models.PROTECT)
试图函数中在子类中配置
# 获取父类需要增加的位置
person = Person.objects.last()
# 把子类对应父类的id配置到父类的配置
idCard.id_person_id = person.id
id_person_id 子类对应父类的id
person.id 父类的id
一对多
- 使用ForeignKey实现
- 在使用的时候也有on_delete
- on_delete和一对一完全一样
#在模板里面定义关系
s_grade = models.ForeignKey('Grade')
#在视图函数里面配置
# 获取父类需要添加的位置
g = Grade.objects.last()
# 添加
stu.s_grade = g
#注意,在添加的时候,需要注意类型,下面这两种等效
stu.s_grade = g
stu.s_grade_id = g_id
def getStudentGrade(request):
stu = Student.objects.last()
# 如果没代码提示,写下面这行代码
# stu = Student()
# 获取父类
g = stu.s_grade
# 得到父类的名字
print(g.g_name)
return HttpResponse('根据学生获取班级%s'%g.g_name)
多对多
- 使用ManyToMany实现
- 随便给那个表定义都行
- 最好使用在从表中,非用户表
- 模型在生成数据表的时候,会生成专门的一张表来维护多对多的关系,关系表
- 关系表中存储的是两张表的id
- 关系表存储多对多的关系
- 主从关系
- 使用ManyToMany的可以认为是从表
- 从表可以管理自己的主表对应数据
- 主表也可以而管理从表中自己对应的数据
- 数据都是一个集合
- add
- remove
- clear
# 最后一个买家,买第一个商品
def generateRelation(request):
buyer = Buys.objects.last()
goods = Goods.objects.first()
# buyer = Buys()
# 向买家的商品集合中添加商品,获取对应的元素
buyer.goods_set.add(goods)
return HttpResponse('成功添加到买家购物车')
继承
- 抽象的模型,不会生成表
- 继承自抽象模型的模型,它会在自己的表中包含抽象模型中的字段
- 抽象的模型不能实例化(只能子类实例化)
- 非抽象模型,会生成自己的表
- 非抽象模型也可以继承
- 所有子表的公共数据会在父表中存储
- 子表特有的属性会在自己额外的表中存储,子表和父表通过外键级联在一起
# 继承
class Animal(models.Model):
a_name = models.CharField(max_length=16)
class People(Animal):
p_learn = models.CharField(max_length=100)
class Dog(Animal):
d_eat = models.CharField(max_length=100)
# 改进
class Book(models.Model):
b_name = models.CharField(max_length=32)
class Meta:
abstract = True
class KindleBook(Book):
k_type = models.IntegerField(default=0)
class ComputerBook(Book):
c_price = models.IntegerField(default=5)