python中的Django框架的模型层

本文介绍了Django的MTV模式,重点讲解模型层,包括模型与数据库的关系,ORM的概念,以及模型层中各种字段类型和参数的使用,如AutoField、CharField、DateField等。还提到了Admin后台管理的相关参数,并提供了模型层的基本查询语法示例。
摘要由CSDN通过智能技术生成

目录

1.前言

Django的MTV分别是值:

2.模型层的定义

模型与数据库的关系

为什么要用模型?

 3.修改数据库引擎

4.模型层的创建的一些常见字段和参数

AutoField

IntegerField

CharField

DateField

DateTimeField

FloatField

DecimalField

TextField(Field)

大段文本类型,一般3000字以上使用

unique

db_index

default

db_column

primary_key

2. 日期字段参数unique_for_date: 日期必须唯一

3. 用于Admin后台管理参数

verbose_name:Admin中显示的字段名称blank:Admin中是否允许用户输入为空editable :Admin中是否可以编辑help_text:Admin中该字段的提示信息choices:Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作(设置方式:choice=((1,‘男’),(2,‘女’),(0,‘未知’)) )

 5.模型层的基本语法和使用


1.前言

 首先Django框架就是由MTV所组成的

Django的MTV分别是值:

M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。
T 代表模板 (Template):负责如何把页面展示给用户(html)。
V 代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。

通过上面的定义我们可以看出Django框架的模型层与数据库有关联的。 

所以模型层重点是如何和数据库进行交互实现的?

2.模型层的定义

那么模型层和数据库有什么关系呢?

模型与数据库的关系

  • 模型(Model)负责业务对象和数据库的关系映射(ORM)
  • ORM是“对象-关系-映射”的简称,主要任务是:
    • 根据对象的类型生成表结构
    • 将对象、列表的操作,转换为sql语句
    • 将sql查询到的结果转换为对象、列表
  • 使用ORM,我们就可以不用像以前一样写sql语言了

在模型层里面关于数据库的一些代码就不会和sql语句一样了,而是有自己的语法结构。 

为什么要用模型?

它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。

要实现Django与数据库的连通,请参考用Navicat连接MySQL的安装及配置_native mysql_embelfe_segge的博客-CSDN博客

 3.修改数据库引擎

 那么在写好模型层数据后,必须得在settings里配置mysql引擎,要让模型层知道在和哪个数据库交互,才能生成对应的迁移文件和数据表。

 

 将其修改为mysql的一些配置,NAME代表数据库的名字,USER表示数据库登录的用户名,PASSWARD表示数据登录的密码,都是你自己下载mysql的时候设置的。

4.模型层的创建的一些常见字段和参数

 字段类型有:

AutoField

int类型且自增,必须填入参数 primary_key=True。当model中如果没有自增字段,则自动会创建一个名为id的字段,并设置为主键、自增。所以django中会自动生成一个id自增的字段。

IntegerField

整数类型,其数值范围在 -2147483648 - 2147483647。

CharField

字符类型,必须提供max_length参数, max_length表示字符长度。

DateField

日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。格式为:年-月-日

常用参数:

  •   auto_now_add = True:创建数据记录的时候会把当前时间添加到数据库, 更改记录不会发生变动。
  • auto_now = True:每次更新数据记录的时候会更新该字段。

DateTimeField

日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。格式为:年-月-日 时:分:秒:毫秒

常用参数如DateField一致

FloatField

浮点数类型,小数越长越不精准

DecimalField

使用 Decimal 实例表示固定精度的十进制数的字段。它有两个必须的参数:

  • max_digits:数字允许的最大位数
  • decimal_places:小数的最大位数

TextField(Field)

大段文本类型,一般3000字以上使用

 参数类型有: 

1.任意字段都可以设置的参数
null

用于表示某个字段可以为空。设置方式:null = True

unique

用于表示该字段值在此表中必须是唯一的,建立唯一索引,设置方式:unique = True

db_index

将该字段设置为索引,设置方式:db_index = True

default

为该字段的默认值,设置方式:default = ‘默认值’

db_column

在数据库中的字段名称,默认和变量同名,设置方式:db_column=‘字段名’

primary_key

设置字段为主键,设置方式:primary_key = True。通常id字段为主键,且唯一主键

2. 日期字段参数
unique_for_date: 日期必须唯一

unique_for_month: 月份必须唯一

unique_for_year: 年份必须唯一

auto_now_add: 增加记录时的时间

auto_now: 更新当前记录的时间

 

3. 用于Admin后台管理参数


verbose_name:Admin中显示的字段名称
blank:Admin中是否允许用户输入为空
editable :Admin中是否可以编辑
help_text:Admin中该字段的提示信息
choices:Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作(设置方式:choice=((1,‘男’),(2,‘女’),(0,‘未知’)) )

 

 5.模型层的基本语法和使用

 必知必会13条

 # 1.models.类名.objects.all() #查询所有数据

    # 2.models.类名.objects.filter()  #带有过滤条件的查询,返回的是一个列表

    # 3.models.类名.objects.get()  #拿到单个数据,但是条件不存在直接报错

    # 4.models.类名.objects.first()  #拿queryset里面的第一个数据
    # res = models.User.objects.all().first()
    # print(res)

    # 5.models.类名.objects.last()  #拿queryset里面的最后一个数据
    # res = models.User.objects.all().last()
    # print(res)

    # 6.models.类名.objects.values()  #可以指定获取的数据字段  select name,age from ...     列表套字典
    # res = models.User.objects.values('name','age')  # <QuerySet [{'name': 'jason', 'age': 18}, {'name': 'egonPPP', 'age': 84}]>

    # 7.models.类名.objects.values_list()  列表套元祖
    # res = models.User.objects.values_list('name','age')  # <QuerySet [('jason', 18), ('egonPPP', 84)]>
    # print(res)

    # 8.models.类名.objects.distinct()  去重
    # res = models.User.objects.values('name','age').distinct()
    # print(res)
    # 去重一定要是一模一样的数据,如果带有主键那么肯定不一样 你在往后的查询中一定不要忽略主键

    # 9.models.类名.objects.order_by()  排序,默认升序
    # res = models.User.objects.order_by('age')  # 默认升序
    # res = models.User.objects.order_by('-age')  # 降序

    # 10.models.类名.objects.reverse()  反转的前提是 数据已经排过序了  order_by()
    # res = models.User.objects.all()
    # res1 = models.User.objects.order_by('age').reverse()
    # print(res,res1)

    # 11.models.类名.objects.count()  统计当前数据的个数
    # res = models.User.objects.count()
    # print(res)

    # 12.models.类名.objects.exclude()  排除在外
    # res = models.User.objects.exclude(name='jason')
    # print(res)
    
    # 13.exists()  基本用不到因为数据本身就自带布尔值  返回的是布尔值
    # res = models.User.objects.filter(pk=10).exists()
    # print(res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值