模型

虚拟环境只是虚拟的Python的文件和库,其他的是操作磁盘上的。

数据迁移

  1. 在开发中建议每次创建一个新的数据库
  2. 当使用旧库的时候,我们会发现成功实现迁移
    • 导致出现问题原因
    • 我们每次迁移都会生成一个迁移记录
    • 迁移记录会在django_migrations表中记录,记录的关键词就是迁移文件名+应用名
    • 修复,将迁移记录删除掉

F对象

  1. 实现一个模型中的两个字段的比较(一班和二班相比较)
  2. 模型中自己的字段进行一个运算
  3. 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对象

  1. 条件的封装
  2. 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进行调整
保护模式下,主表有内容,不能删除,没内容,可以删除

  1. 使用models.OneToOneField实现
  2. 这个字段在哪一个模型中都是可以使用的
    • 使用了OneToOne的模型,默认它会随着绑定的数据而进行变化,绑定的数据被删除,它也会被删除
  3. 添加顺序
    • OneToOne绑定的表是主表
    • 使用OneToOne的是从表
  4. on_delete
    • 默认CASECADE,默认从表数据跟随主表删除(比较暴力,容易出问题,开发中基本不用)
    • PROTECT,保护默认,开发中常用(主表数据有从表数据的时候,主表是不能实现删除的)
    • SETXXX 当删除,设置对应的字段值为YYY
  5. PROTECT保护的是主表数据
  6. 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

一对多

  1. 使用ForeignKey实现
  2. 在使用的时候也有on_delete
  3. 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)

多对多

  1. 使用ManyToMany实现
  2. 随便给那个表定义都行
  3. 最好使用在从表中,非用户表
  4. 模型在生成数据表的时候,会生成专门的一张表来维护多对多的关系,关系表
  5. 关系表中存储的是两张表的id
  6. 关系表存储多对多的关系
  7. 主从关系
    • 使用ManyToMany的可以认为是从表
    • 从表可以管理自己的主表对应数据
    • 主表也可以而管理从表中自己对应的数据
    • 数据都是一个集合
      • add
      • remove
      • clear
 # 最后一个买家,买第一个商品
def generateRelation(request):
    buyer = Buys.objects.last()
    goods = Goods.objects.first()

   # buyer = Buys()
    # 向买家的商品集合中添加商品,获取对应的元素
    buyer.goods_set.add(goods)
    return HttpResponse('成功添加到买家购物车')

继承

  1. 抽象的模型,不会生成表
    • 继承自抽象模型的模型,它会在自己的表中包含抽象模型中的字段
    • 抽象的模型不能实例化(只能子类实例化)
  2. 非抽象模型,会生成自己的表
    • 非抽象模型也可以继承
    • 所有子表的公共数据会在父表中存储
    • 子表特有的属性会在自己额外的表中存储,子表和父表通过外键级联在一起

 # 继承
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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值