Django Models

给你一囗甜甜゛ 提交于 2020-03-27 16:32:58

3 月,跳不动了?>>>

Django Models(模型)

ORM对象映射(object relation mapping)

什么是ORM? 1. Python、PHP、Java是一种开发语言,而MySQL、SQL Server则采用数据库语言,不同语言之间如何实现互操作? 2. SQL语言包括包括数据定义语言DDL、数据控制语言DCL、数据查询语言DQL、数据操作语言DML等,例如INSERT、DELETE、SELECT、UPDATE操作。 3. 作为开发人员,应该把精力放在核心业务代码的编写上面,而不应该花太多精力跟数据库语言打交道。 4. ORM(Object-Relational Mapping,对象关系映射)技术可以看做是开发者和数据库之间的桥梁,用于实现数据库和编程语言之间的映射,本质上来看,ORM就是将SQL操作和编程语言操作做了一个翻译。 5. 通过ORM技术来操作数据库,使得开发者无需接触SQL语句,而直接操作对象的属性和方法,大大提高了开发效率。 ORM的功能是什么? 1. 映射技术:数据类型映射、类映射、关系映射。例如,每一张数据库表对应开发语言的类,每一个数据字段对应类中的属性。 2.CRUD操作:CRUD即增删查改操作,在SQL语句中通过Insert、Select、Update、Delete来实现,在ORM库中则需要通过对应的函数来实现,例如Django ORM通过get、filter、save、delete函数进行操作。 3. 缓存优化:(惰性操作)从数据库查询到的数据以类对象的形式保存在内存,用于随时提取; 真正需要查询结果时才执行数据库的select操作,而不是在ORM查询命令执行时查询数据库。 有哪些ORM技术? Django ORM Django ORM是Django框架内置实现的,简单易用 通过创建Model类和定义Field字段来实现 SQLAlchemy SQLAlchemy则是目前Python ORM通用标准 Peewee Storm

models.py创建

1)创建语法

    from django.db import models    # 导入models模块
    class ModelName(models.Model):   # 创建模型类并继承models.Model
        field1 = models.XXXField(verbose_name="xxx", max_length=xxx )    # 创建field字段,通过Models.XXXField方法;字段里面有xxx属性
        filed2 = models.XXXField(  )
        field3 = models.XXXField(  )
        class Meta:    
        # 定义Meta子类,为模型类添加其他附加说明
            verbose_name = XXX
            verbose_name_plural = XXX

说明 所有Django模型类继承django.db.models; 每个类ModelName对应数据库中的一张表; 名称格式:appname+modelname 每个field属性对应数据库中的数据项; Meta子类应用定义模型元数据包括数据库表名、默认排序方式、数据库模型等。 Model案例

    class UserCMS(models.Model):  #创建了一张usercms的表
            username = models.CharField(verbose_name="姓名", max_length=50, default="",  null=True, blank=True, )   #在表里面,创建username的列;此列的名称叫做“姓名”,此列的最大长度是50
            password = models.CharField(verbose_name="密码", max_length=50)
            在表里面,创建password的列
            此列的名称叫做“密码”,此列的最大长度是50
        说明
            这里在数据库中,对应的生成一种表cms_usercms,并且具备username和password字段

2)属性及字段

Field类型

AutoField:一个自动递增的整型字段,添加记录时它会自动增长,通常用于数据表的主键;
        CharField:字符串字段,用于输入较短的字符,对应html标签<input type="text">;
        TextField:文本字段,用于输入较多的字符,对应html标签<input type = "textarea">;
        EmailField:邮箱字段,用于输入带有Email格式的字符
        DateTimeField:日期字段,支持时间输入
        ImageField:用于上传图片并验证图片合法性,需定义upload_to参数,使用本字段需安装python pillow等图片库
        IntegerField:整数字段,用于保持整数信息

Field属性 primary_key:设置True or False,定义此字段是否为主键 default:设置默认值,可以设置默认的文本、时间、图片、时间等 null:设置True or False,是否允许数据库字段为Null,默认为False blank:设置True or False,定义是否运行用户不输入,默认为False;若为True,则用户可以不输入此字段 choices:设置该字段的可选值,本字段的值是一个二维元素的元祖;元素的第1个值为实际存储的值,第2个值为HTML页面显示的值 max_length:设置默认长度,一般在CharField、TextField、EmailField等文本字段设置 verbose_name:设置该字段的名称,所有字段都可以设置,在Web页面会显示出来(例如将英文显示为中文) upload_to:设置上传路径,ImageField和FileField字段需要设置此参数 Meta类属性 verbose_name:设置对象名称(例如usecms),若没有设置,则默认为该类名的小写分词形式,例如类名为CamelCase会被转换为camel case; verbose_name_plural:设置对象名称复数(例如usercms),一般设置跟verbose_name一样,否则会默认加s; db_table:设置映射的数据表名,默认为“应用名_模型名”,即用该模型所在app的名称加本模型类的名称 proxy:设置True or False,设置本模型及所有继承本模型的子模型是否为代理模型; abstract:设置True or False,设置本模型类是否为抽象基类; 案例

    class User(models.Model):
            """
            用户
            """
        name = models.CharField(verbose_name="别名", max_length=100, default="")
        email = models.CharField(verbose_name="邮箱", max_length=100)
        password = models.CharField(verbose_name="密码", max_length=128)
            mobile = models.CharField(verbose_name='手机', max_length=11, blank=True, null=True)
            birday = models.DateField(verbose_name=u"生日", null=True, blank=True)
            gen = (
                ("male", "男"),
                ("female", "女"),
            )
            gender = models.CharField(verbose_name="性别", choices=gen, default="male", max_length=10)
            image = models.ImageField(verbose_name="头像", upload_to="users/%Y/%m", max_length=200, blank=True, null=True)
        

 

        class Meta:
            verbose_name = "用户"
            verbose_name_plural = verbose_name
    
        def __unicode__(self):
            return self.username

3)数据同步

全局同步 makemigrations # 生成数据库表初始化文件initial.py文件 migrate # 基于数据库表初始化文件initial.py文件,正式生成数据表 部分同步 makemigrations cms migrate cms

model操作:

    语法
        ModelName.Objects.all( ) #查询模型类的所有数据
        ModelName.Objects.filter( ) #返回符合筛选条件的数据集(一个或多个对象)
        ModelName.Objects.get( ) #返回符合筛选条件的数据(单个对象)
        ModelName.Objects.exclude( )#返回不符合筛选条件的数据集

案例

all_users = UserCMS.objects.all() #将数据表usercms的对象都取出来
        interview = Interview.objects.get(id=int(interview_id))  # 根据id获取具体面经
        all_interviews = Interview.objects.filter(company=company)  #获取此公司的面经

2)增加

语法
        ModelName.save( )
        ModelName.create( )
    案例
        user_cms = UserCMS()
                user_cms.username = username
                user_cms.password = password
                user_cms.save()
        user_cms = UserCMS.objects.create(username=username, password=password)
                    comment.save()

3)删除

语法
        ModelName.Objects.all( ).delete( )#查询所有对象并删除
        ModelName.Objects.filter( ).delete( ) #过滤特定对象(一个或多个)并删除
        ModelName.Objects.get( ).delete( ) #过滤特定对象(一个)并删除
        ModelName.Objects.exclude( ).delete( ) #除了特定对象,其他都删除
    案例
        deluser = UserCMS.objects.filter(username=username, password=password)
        deluser.delete()

4)排序

    语法
        ModelName.Objects.all( ).order_by('xxx') #查询模型类的所有数据并根据关键词排序
    案例
        all_interviews = Interview.objects.all().order_by('-read_counts')

5)切片

语法
        ModelName.Objects.all( ).order_by('xxx')[a:b] #查询模型类的所有数据并根据关键词排序
            再此基础上只取从a到b的对象
    案例
        all_interviews = Interview.objects.all().order_by('-read_counts')[:6]
            查询模型类的所有数据并根据关键词排序,并且只取前面6个对象
        recommended_interviews = Interview.objects.filter(company=recommended_tag).exclude(id=int(interview_id)).order_by('-read_counts')[:3]
            # 除去本面经,筛选同公司阅读次数最高的其他三篇面经作为推荐面

进阶操作

关系操作 一对一操作 一对多操作 多对多操作

面向对象操作 抽象类继承 多表继承 代理模型继承

 

基础操作

1)查询:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!