Django框架

MVC编程模式

        MVC是          

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:

  • Model(模型)表示应用程序核心(比如数据库记录列表)。
  • View(视图)显示数据(数据库记录)。
  • Controller(控制器)处理输入(写入数据库记录)。

MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。

Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。

通常模型对象负责在数据库中存取数据。

View(视图):是应用程序中处理数据显示的部分。

通常视图是依据模型数据创建的。

Controller(控制器):是应用程序中处理用户交互的部分。

通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MTV编程模式

本质上与MVC模型没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些不同。也是Django使用的一种编程模式。

Model(模型):负责业务对象与数据库的对象(ORM)

Template(模板):负责如何把页面展示给用户

View(视图):负责业务逻辑,并在适当的时候调用Model和Template

注意:Django还有一个url分发器它的作用是将一个个URL的页面请求分发给不同的view处理,view在调用Model和Template。

下面分别对Django各模块进行介绍:

Model(模型)
        概述:Django对各种数据库都提供了很好的支持,并且为这些数据库提供了统一的调用接口API,我们可以根据业务需求选择使用不同的数据库。
     ORM
    概述: ORM 对象-关系-映射 是一种程序技术,它可以将对对象的操作自动转换成对应数据库的语句 它的任务就是根据类生成表结构 将对象、列表的操作转换为SQL 语句、将SQL 查询到的结果转换为对象、列表。它具有的优点:极大的减少开发人员的工作量,不需要面对因数据库变更而导致代码无效。
  任务:它是根据类生成表结构,将对象列表的操作转换为SQL语句,将SQL查询到的结果转换为对象、列表。
  优点:极大地减少了开发人员的工作量,不需要面对因数据库变更而导致代码无效。
  缺点:会增加时间开销,降低效率,性能相对较低,增加学习成本。
  定义模型:一个模型在数据库中对应一张表,在模型中定义属性,对应该模型对照表中的一个字段。
  创建模型对象常用的有两种方式:
    第一种方式:
    在模型中创建学生类
    class Student(models.Model):
    # 自定义管理器
    name     = models.CharField(max_length=20)
    sex      = models.BooleanField()
    contend  = models.CharField(max_length=20)
    age      = models.IntegerField()
    grade    = models.ForeignKey("Grade")
    isDelete = models.BooleanField(default=False)
    def __str__(self):
        return self.name
    class Meta:
        db_table = "students"
        ordering = ["-id"]
    @classmethod
    def create(cls, name, sex, age, contend, grade):
        return cls(name=name, sex=sex,age=age,contend=contend,grade=grade)
在视图中创建学生对象
def addStudent(request):
    stu = Student.create("kaige",True,17,"kaige is a nice man", Grade.objects.get(pk=2))
    stu.save()
    stus = Student.objects.all()
    return render(request, 'myApp/students.html', {"stus": stus})
    第二种方式:
在自定义管理类中添加一个方法
   class StudentManager(models.Manager):
    def get_queryset(self):
        return super(StudentManager, self).get_queryset().filter(isDelete=False)
    def create(self, name, sex, age, contend, grade):
        obj = self.model()
        obj.name = name
        obj.sex = sex
        obj.age = age
        obj.contend = contend
        obj.grade = grade
        return obj
class Student(models.Model):
    # 自定义管理器
    objects = StudentManager()

    name     = models.CharField(max_length=20)
    sex      = models.BooleanField()
    contend  = models.CharField(max_length=20)
    age      = models.IntegerField()
    grade    = models.ForeignKey("Grade")
    isDelete = models.BooleanField(default=False)
    def __str__(self):
        return self.name
    class Meta:
        db_table = "students"
        ordering = ["-id"]
在视图中创建学生对象
def addStudent(request):
    stu = Student.objects.create("kaishen", True, 19,"kaishen is a cool man", Grade.objects.get(pk=3))
    stu.save()

    stus = Student.objects.all()
    return render(request, 'myApp/students.html', {"stus": stus})
模型的继承
默认模型时是允许继承的,但是默认的继承处理方式不是很合理,在开发中需要将父类抽象化,在元信息中添加abstart=True。
示例如下:
class Animal(models.Model):
    name = models.CharField(max_length=20)
    age  = models.IntegerField()
    class Meta:
        # 将该类抽象化,将父类中的字段直接放入子类对应的表中,并且不会生成该模型对应的表
        abstract = True
class Dog(Animal):
    a = models.CharField(max_length=10)
模型关系
1:1
使用场景:表的字段太多,需要拆分.
class Person(models.Model):
    name = models.CharField(max_length=20)
    age  = models.IntegerField()
class IDCard(models.Model):
    cardID = models.CharField(max_length=18)
    sex    = models.BooleanField()
    # 关系存放在哪张表里都可以
    # 绑定身份证与人的一对一关系,默认情况下,当人被删除,于人绑定的身份证也就删除了,这个可以使用on_delete来进行调整
    person = models.OneToOneField(Person)
on_delete各种类型:
models.CASCADE:默认值;
models.PROTECT:保护模式;
models.SET_NULL:置空模式;
models.SET_DEFAULT:置默认值;
models.SET():删除的时候重新动态指定一个实体访问对象
注意:声明关系的表示从表
级联数据获取:
主获取从:关系字段是隐性属性,对象.关系模型名(小写)
def person(request, pid):
    per = Person.objects.get(pk=pid)
    return HttpResponse(per.name+"--"+per.idcard.cardID)
从获取主:关系是直接声明的,它是一个显性属性
def idcard(request, cid):
    card = IDCard.objects.get(pk=cid)
    return HttpResponse(card.cardID+"--"+card.person.name)
m:n
原理:底层是通过两个外键实现的,两个外键存在于关系表中。会自动生成一张外键管理表
class Buyer(models.Model):
    name  = models.CharField(max_length=20)
    level = models.IntegerField(default=1)
class Goods(models.Model):
    name  = models.CharField(max_length=20)
    price = models.FloatField()
    num   = models.IntegerField()
    # 形成多对多关系,外键写在哪张表里都可以
    buyers = models.ManyToManyField(Buyer)
模型查询
简介:从数据库中获取对象集合,查询集可以有零个、一个或者多个过滤器,过滤器基于所给的参数限制查询结果。
从sql的角度,和查询集合select语句等价,过滤器如:where和limit等子句。查询集不会带来任何数据库的访问,直到调用数据时才会访问数据库。










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值