Python Django模型详解

目录
  • Django模型
    • 字段类型
    • 字段类型的参数
    • 外键
  • 总结

Django模型

Django的模型定义在models.py文件中。模型是MVT中的M,也相当于MVC中的M。

在Django中,模型必须继承自Model类。例如:

from django.db import models
# Create your models here.
class BookInfo(models.Model):       # 一个模型类就会对应生成数据库中的一张表
    """书籍模型"""
    name = models.CharField(max_length=128, verbose_name='名称')        # 类的属性就是数据表中的字段。
    pub_date = models.DateField(verbose_name='发布日期',null=True)
    readcount = models.IntegerField(default=0, verbose_name='阅读量')
    commentcount = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    class Meta:     # class Meta是固定写法
        db_table = 'bookinfo'      # 指明数据库表名
        verbose_name = '图书'       # 在admin站点中显示的名称

注意

1.模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名,一般我们会通过db_table指明数据库表名。

2.django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。默认创建的主键列属性为id,也可以使用pk,意为primary key.

3.字段名称中不能出现双下划线,因为这是Django的查询语法之一。

自Django3.2后,可以在settings.py中配置DEFAULT_AUTO_FIELD参数来设置主键的数据类型,默认是DEFAULT_AUTO_FIELD = ‘django.db.models.BigAutoField',在Django3.2之前,默认生成的主键数据类型是AutoField.

下面是Django中常用的字段类型的详情

字段类型

类型 说明
BigAutoField 自动增长的BigIntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
BooleanField 布尔字段,值为True或False
NullBooleanField 支持Null、True、False三种值
CharField 字符串,参数max_length表示最大字符个数
TextField 大文本字段,一般超过4000个字符时使用
IntegerField 整数
DecimalField 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
FloatField 浮点数
DateField 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
TimeField 时间,参数同DateField
DateTimeField 日期时间,参数同DateField
FileField 上传文件字段
ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片

下面是字段类型中的参数

字段类型的参数

参数 说明
null 如果为True,表示允许为空,默认值是False
blank 如果为True,则该字段允许为空白,默认值是False
db_column 字段的名称,如果未指定,则使用属性的名称
db_index 若值为True, 则在表中会为此字段创建索引,默认值是False
default 为字段指定默认值
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique 如果为True, 这个字段在表中必须有唯一值,默认值是False
choices 该参数是从一系列的二元组中提供选项

注意

1.CharField字段必须要指定参数max_length

2.还可以为字段指定参数verbose_name,这个参数主要是用来在admin管理页面使用,其实是和本地化有关的。例如可以在上面的name字段指定参数verbose_name=“书籍名称”,那么在admin管理页面就会看到书籍名称。

3.null参数是数据库层面的,设置null=True之后,表示数据库的该字段可以为空;blank参数是表单层面(HTML),blank=True之后,表示表单填写该字段的时候可以不填。

外键

外键这个东西,通常都是在业务逻辑层面来实现的,而不是在数据库中实现。但是通常大家学习的数据库课程中,都会有数据库设计范式,其中有个第三范式就是专指的外键约束。在这里只是简单的介绍一下。下面是另外一个模型,和前面的BookInfo模型通过外键关联起来。

class PeopleInfo(models.Model):
    """人员模型"""
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    class Meta:
        db_table = 'peopleinfo'
        verbose_name = '人物信息'
下面重点来说一下choices这个参数和models.ForeignKey。
choices参数就是从我们定义的二元组(GENDER_CHOICES)中获取值。二元组的第一个值会储存在数据库中,而第二个值将只会用于在表单中显示。对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用 get_FOO_display() 方法。例如:获取上面的性别信息,可以使用get_gender_display()方法。
外键:通过使用models.ForeignKey来设置外键,ForeignKey的第一个参数是要关联的模型类名,第二个参数是on_delete。它的常用值可以如下:
CASCADE级联,删除主表数据时连通一起删除外键表中数据
PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
SET()设置为特定值或者调用特定方法
DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常

注意:我们在数据库中,设置外键的时候需要制定另一张表中关联的字段,但是在Django里并没有指定。这是因为Django会默认指定另外一张表的id作为关联字段。如下图所示:

可以看到peopleinfo这张表中的外键名称是book_id

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • python利用xpath爬取网上数据并存储到django模型中

    帮朋友制作一个网站,需要一些产品数据信息,因为是代理其他公司产品,直接爬取代理公司产品数据 1.设计数据库 from django.db import models from uuslug import slugify import uuid import os def products_directory_path(instance, filename): ext = filename.split('.')[-1] filename = '{}.{}'.format(uuid.uuid4().

  • Django CBV模型源码运行流程详解

    在view文件中编写一个类,并配置好路由 class Test(View): def get(self, request, *args, **kwargs): return HttpResponse('cbv_get') def post(self, request, *args, **kwargs): return HttpResponse('cbv_post') url(r'test/',views.Test.as_view()), 通过as_view()进入查看源码 实际上views.Te

  • Django数据模型中on_delete使用详解

    on_delete属性针对外键ForeignKey 一.django3.0官方文档介绍: Many-to-one relationships多对一关系 To define a many-to-one relationship, use django.db.models.ForeignKey. You use it just like any other Field type: by including it as a class attribute of your model. ForeignK

  • Django3中的自定义用户模型实例详解

    介绍 嗨,在这篇文章中,我们将学习在Django 3中创建自定义用户模型,并且还将更改Django Admin的默认登录功能. 我们将使用电子邮件和密码登录. 动机 我必须为我的应用程序创建一个"自定义用户",我能够创建模型,但问题是createsuperuser命令无法正常工作. 为了调试它,我不得不做大量研究,问题是当时大多数资源已经过时,所以我决定写这篇文章. 我做了一个GitHub仓库,所以如果您愿意,可以直接使用它(这里有说明) 让我们开始吧 首先,创建一个Django Pr

  • Django模型验证器介绍与源码分析

    前言 在Django的模型字段参数中,有一个参数叫做validators,这个参数是用来指定当前字段需要使用的验证器,也就是对字段数据的合法性进行验证,比如大小.类型等. Django的验证器可以分为模型相关的验证器和表单相关的验证器,它们基本类似,但在使用上有区别. 本文讨论的是模型相关的验证器. 一.自定义验证器 一个验证器其实就是一个可调用的对象(函数或类),接收一个初始输入值作为参数,对这个值进行一系列逻辑判断,如果不满足某些规则或者条件,则表示验证不通过,抛出一个ValidationE

  • django模型查询操作的实现

    目录 1.创建对象 2.保存ForeignKey和ManyToManyField字段 3.检索对象 跨越多值的关系查询 使用F表达式引用模型的字段: 4.缓存和查询集 5.使用Q对象进行复杂查询 6.比较对象 7.删除对象 8.复制模型实例 9.批量更新对象 10.关系的对象 反向查询: 11.使用原生SQL语句 一旦创建好了数据模型,Django就会自动为我们提供一个数据库抽象API,允许创建.检索.更新和删除对象操作 下面的示例都是通过下面参考模型来对模型字段进行操作说明: from dja

  • Django Admin后台模型列表页面如何添加自定义操作按钮

    你需要添加两个按钮:一个按钮使所有英雄都可以死亡,而另一个按钮使所有英雄永生.由于它会影响所有英雄,而与选择无关,因此这需要一个单独的按钮,而不是操作下拉菜单. 首先,我们要更改HeroAdmin管理模型使用的模板文件,以便我们可以添加两个按钮: @admin.register(Hero) class HeroAdmin(admin.ModelAdmin, ExportCsvMixin): change_list_template = "entities/heroes_changelist.ht

  • Python Django模型详解

    目录 Django模型 字段类型 字段类型的参数 外键 总结 Django模型 Django的模型定义在models.py文件中.模型是MVT中的M,也相当于MVC中的M. 在Django中,模型必须继承自Model类.例如: from django.db import models # Create your models here. class BookInfo(models.Model): # 一个模型类就会对应生成数据库中的一张表 """书籍模型""

  • 在脚本中单独使用django的ORM模型详解

    有时候在测试django中一些模块时,不想重新跑一整个django项目,只想跑单个文件,正好写在if __name__ == '__main__': 这样也不会打扰到正常的代码逻辑 方法 正常方法 大家都知道的方法就是'python manage.py shell',当然我知道这可能不是你需要的: 更好用的方法 在脚本中import模型前调用下面几行即可: import os, sys BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #

  • Python中函数参数匹配模型详解

    当我们的函数接收参数为任意个,或者不能确定参数个数时,我们,可以利用 * 来定义任意数目的参数,这个函数调用时,其所有不匹配的位置参数会被赋值为元组,我们可以在函数利用循环或索引进行使用 def f(*args): # 直接打印元组参数 print(args) print('-'*20) # 循环打印元组参数 [print(i) for i in args] ... # 传递一个参数 f(1) print('='*20) # 传递5个参数 f(1, 2, 3, 4, 5) 示例结果: (1,)

  • Python之两种模式的生产者消费者模型详解

    第一种使用queue队列实现: #生产者消费者模型 其实服务器集群就是这个模型 # 这里介绍的是非yield方法实现过程 import threading,time import queue q = queue.Queue(maxsize=10) def Producer(anme): # for i in range(10): # q.put('骨头%s'%i) count = 1 while True: q.put('骨头%s'%count) print('生产了骨头',count) cou

  • python多进程中的生产者和消费者模型详解

    目录 Python生产者消费者模型 一.消费模式 二.传输原理 三.实现方式 Python生产者消费者模型 一.消费模式 生产者消费者模式 是Controlnet网络中特有的一种传输数据的模式.用于两个CPU之间传输数据,即使是不同类型同一厂家的CPU也可以通过设置来使用. 二.传输原理 类似与点对点传送,又略有不同,一个生产者可以对应N个消费者,但是一个消费者只能对应一个生产者: 每个生产者消费者对应一个地址,占一个网络节点,属于预定性数据,在网络中优先级最高: 此模式如果在网络中设置过多会影

  • Python Socket编程详解

    背景 关于Python Socket编程,首先需要了解几个计算机网络的知识,通过以下的几个问题,有助于更好的理解Socket编程的意义,以及整个框架方面的知识: TCP和UDP协议本质上的区别? TCP协议,面向连接,可靠,基于字节流的传输层通信协议:UDP协议无连接,不可靠,基于数据包的传输层协议. TCP协议在建立连接的过程需要经历三次握手,断开连接则需要经历四次挥手,而这建立连接的过程增加了传输过程中的安全性. 而建立连接的过程则会消耗系统的资源,消耗更多的时间,而相比较UDP协议传输过程

  • Django的基本运用之Django垃圾分类详解

    title: 利用Django实现一个能与用户交互的初级框架 author: Sun-Wind date: September 1, 2021 Django实现基本的框架此框架的功能是搭建服务器,使得服务器和客户端交互 此框架可以接受客户端的请求,并返回根据请求所得到的结果 这里列举一个垃圾识别分类的例子 Django简介 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架. 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站

  • Django使用详解:ORM 的反向查找(related_name)

    先定义两个模型,一个是A,一个是B,是一对多的类型. class A(models.Model): name= models.CharField('名称', max_length=32) class B(models.Model): a= models.ForeignKey(A, verbose_name='A类',related_name = "test") name = models.CharField('称呼', max_length=16) 如果我们要查询一个A拥有哪些B的话,

  • [机器视觉]使用python自动识别验证码详解

    前言 CAPTCHA全称Completely Automated Public Turing Test to Tell Computers and Humans Apart,即全自动区分人机的图灵测试.这也是验证码诞生的主要任务.但是随着近年来大数据运算和机器视觉的发展,用机器视觉识别图像已经变得非常容易,过去用于区分人机的验证码也开始变得不再安全. 接下来就让我们从零开始,深入图像处理和算法构建,来看看使用机器视觉来识别过时的验证码( 如下所示 )究竟可以有多简单. 载入需要的程序包 & 设置

  • python flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pip install flask 2.简单上手 一个最小的 Flask 应用如下: from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World' if __na

随机推荐