前言:入门学习笔记篇着重介绍一个项目的基本逻辑及原理,之后我会把完整的操作步骤手把手写出来,会考虑写在学习笔记中,也会考虑重新开一个实操,到时再看。

但是这个后端python的开发其实就业没有java广,64开或者73开吧(笑),可能都不到这个比例,如果是为了以后当饭吃还是建议学java,但是java确实入门会更难。要做个类比的话就是,java对增删改查的操作是从底层的,可以底层操作也可以调用方法,能做的事情巨牛魔多,但是django就是基本只能调用方法,django能做的java都能做,django做不了的java也能做。

虽然这么说,但是django本身方法涵盖的内容也很多了,看个人需求。

 django入门,先了解这个库的用处是什么?我们学是为了什么业务需求?

基于django的后端开发,其主要想实现的业务逻辑是对数据库的增删改查,也就是CURD工程师,旨在通过django里面的方法来实现对数据库的操作,包括接收前端的数据以及处理数据入库并将数据返回到前端,由前端制作页面并且展示出来。

django的运行逻辑——models

django的核心可以简单概括为MVT,其中M为models,这个M(不是SM)就是数据库的建库,我们在执行后续操作的时候,都是根据库来实现,比如你要搭建一个图书馆管理系统,那么是不是书要作为一个表,书这个表要有字段,是不是有作者、书名、书的SSIN编号?models实现的就是从后端利用代码来建表添加字段,下面举出代码示例:

class Book(models.Model):
    book_name = models.CharField(verbose_name='图书名称', max_length=64,unique=False, null=True, blank=True)
    book_author = models.CharField(verbose_name='图书作者', max_length=32,unique=False, null=True, blank=True)
    book_type = models.CharField(verbose_name='图书类型', max_length=32,unique=False, null=False, blank=False)
    book_SSIN = models.IntegerField(verbose_name='图书编码', unique=True, null=False,blank=False)

    class Meta:
        verbose_name_plural = '图书'
        db_table= 'book'

我们一项一项来,众所周知,class在python中,我们把它用做,然后子类的可以继承父类,包括继承父类的属性,调用父类的方法等,我们在使用django时,使用别人预设好的东西,这个类会直接变成表,models.Model就是调用它所包含的方法。

class Book(models.Model):

首先从命名开始说,每个企业都应该有自己的命名规范,因为一个项目涉及到多个模块,如果命名没有规范,那么这家企业离倒闭也不远了。首先表的命名就是中译英,书的表就是book,审核机构就是audit result。

示例里我用驼峰法来命名表的名字,驼峰法是什么,骆驼都见过吧,驼峰,凹凹,驼峰,凹凹。所以驼峰法就是对一个词组来说,首字母大写,其余拼写小写,不空格。以审核机构来举例audit result,就应该是AuditResult。所以这里是Book。

下一步,我们有表了,该思考业务逻辑添加字段了,书是不是有名字,有作者,有书的编码,所以这些是不是都要?

    book_name = models.CharField(verbose_name='图书名称', max_length=64,unique=False, null=True, blank=True)
    book_author = models.CharField(verbose_name='图书作者', max_length=32,unique=False, null=True, blank=True)
    book_type = models.CharField(verbose_name='图书类型', max_length=32,unique=False, null=False, blank=False)
    book_SSIN = models.IntegerField(verbose_name='图书编码', unique=True, null=False,blank=False)

那么看看,字段怎么创建,首先字段的属性在表里面是要设置的,他是整形、浮点型、还是字符?所以调用models里面封装好的方法,这里着重介绍字节字符,字符是泛用性和使用率最高的,

其中verbose_name是声明这个字段的名称,你可以不要,但是有的话方便看,不是必须。

max_length是字符必须要规定的长度,你要给这个字段多少储存空间?不要会报错!

unique是唯一性,如果为Ture,那么这个表里的这个字段里面的数据就不能重复,重复会报错!书名可以重复吗?其实也可以,但是编码总不能重复了吧?所以这里编码的unique是Ture,不是必须。如果不特别指定的话,默认会认为unique = False。

null就是字面意思,是否允许数据为空,默认是False,在你不设置的情况下,不是必须,但是建议设成Ture,因为方便你测试接口。不是必须。

blank就是表单验证,前端给你传回数据的时候,是否允许它为空,如果传回的数据为空就会报错!默认好像是False,建议设置为Ture,方便测试接口,不是必须。

    class Meta:
        verbose_name_plural = '图书'
        db_table= 'book'

那么就到最后一步了,这一步其实你也可以不要,因为这里不要是不会影响建库的,但是!为了你在数据库可以轻松的找到,这一步还是不要省略。Meta是预设好的关键字,第一项是命名不赘述说第二项,第二项就是起名了,这个名字是什么,会影响这个表在数据库里叫什么。

这里有同学会有疑问了,为什么不是驼峰法?因为这个表名,数据库里没有大写也就是说就算你在这里命名为Book也会变为book,所以如果是词组,这里的命名就用下划线间隔,比如audit_result。

django的运行逻辑——views

M的部分我们把数据库的表给建好,下一步就是对表进行操作了,这一步就是MVT中的V,view(视图),所有对于表的增删改查,数据处理基本都放在这里。首先先展示一部分代码:

以下这个方法是不指定request:

def book_add(request):
    if request.method == 'POST':
        book_name = request.POST.get('book_name')
        book_author = request.POST.get('book_author')
        book_type = request.POST.get('book_type')
        book_SSIN = request.POST.get('book_SSIN')

以下这个方法是指定request:

@api_view(["POST"])
def book_add(request):
    book_name = request.data.get('book_name')
    book_author = request.data.get('book_author')
    book_type = request.data.get('book_type')
    book_SSIN = request.data.get('book_SSIN')

注意:两者看起来区别不大,实际上区别天差地别,第二种具有极强的普适性,生产环境中普遍采用第二种,下面一项一项的开始对内容进行讲解。

首先,要对数据进行操作,那么我们肯定要写出操作方法,这个操作方法我们就要像函数一样对它定义,这个request就是我们继承的属性,先说request,请求。请求的种类有很多:

其中最常用的就是前四种,增删改查,这个请求你可以理解为,django的服务就是开启一个服务器,别人可以来访问,访问就像进入别人家一样(偷感很强),需要有钥匙才能进门,这个请求就是钥匙,POST一般是新增的时候用这个请求,这里第一种第二种的方法就有区别了,第一种方法对应的是不指定钥匙,也就是你可以拿很多不同的请求来找我,你都能进来,但是我接受数据的方式只能接受POST。 

def book_add(request):
    if request.method == 'POST':
        book_name = request.POST.get('book_name')
        book_author = request.POST.get('book_author')
        book_type = request.POST.get('book_type')
        book_SSIN = request.POST.get('book_SSIN')

然后继续往下,这个book_name是我们自己命名的变量,你可以随便指定,然后这个变量=请求这个方法下,接受POST的钥匙的数据,拿取在前端传回的为“book_name”的字段里面的内容。如果写为

name = request.POST.get("name")

就相当于name这个变量等于POST请求拿到前端传过来字段为“name”里面的内容。

就比如如果前端这样子传回来,用的是POST请求,我们就可以拿到"肖申克的救赎 "的字符,懂了吧。

那么第二种方法就是:

@api_view(["POST"])
def book_add(request):
    book_name = request.data.get('book_name')
    book_author = request.data.get('book_author')
    book_type = request.data.get('book_type')
    book_SSIN = request.data.get('book_SSIN')

开局先指定请求要为POST才能进的来,其他请求会报405还是403错误,然后进来的数据拿取方式为request.data.get,是不是看起来就很苏巴拉西,非常美妙,它和第一张的区别就是,你如果要用DELETE请求传数据,只需要把@api_views后面里面的内容改为DELETE就可以拿到了,其他的PUT一般是改,GET就是查询,都是同理。但是第一种request.POST.get就不行,还需要把这个也改了。也就是说第二种是万用方法。

但是注意,这里前端传回来的数据要放在form—data里,

这里简单说两句数据体,Params是请求头,这个Body相当于是身体,我们的数据拿取拿到的是身体里form—data里面的数据,这个可以和前端对接。 

那么继续下去,这样子我们就拿到了前端传回来要新增的东西,比如说是:

这是前端传回来的数据,我们后端这里的四个数据拿到的就是:book_name = "肖申克的救赎",book_author= "卧龙岗上有卧龙",book_type = "文学巨著",book_SSIN = "1",有了数据我们就可以保存进去,那么就要调用models的方法了,代码如下:

models.Book.objects.create(book_name=book_name, book_author=book_author,book_type=book_type,book_SSIN =book_SSIN)

那么它的意思就是说,调用models里面的方法,在名为Book的表(这里就会有疑问了,细心的同学应该记得我们明明不是声明了它是book吗?这里的Book是类的名,而不是我们声明的名,要以我们class后面的内容为主)创建一条新的数据,数据的内容是表中book_name的字段等于变量book_name的值,也就是说,你可以换一个变量名,前面的是表中字段名,后面的是等于的变量的值,这个是不影响的,那么这样子操作以后,我们打开数据库里的这张表,就可以成功的看到这张表的内容以及被添加进去了。

到此,学习笔记1结束,我会慢慢的持续的更新,下一篇带来的是学习笔记1的实验实操,感兴趣的同学可以关注我,动动发财的小手我们一起进步!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐