热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Django项目知识点(三)

本文一篇完全介绍django的最重要的model6.djangomodel模型是数据唯一而且准确的信息来源。它包含正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据

本文一篇完全介绍django的最重要的model

6.django model

模型是数据唯一而且准确的信息来源。它包含正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据库表。

这个模型定义了一个 Person, 其拥有 first_name 和 last_name:

from django.db import models class Person(models.Model):     first_name = models.CharField(max_length=30)     last_name = models.CharField(max_length=30)

但是对于大多数的模型都是要机构字段相同的,需要创建base.model(一般的位置再utils文件夹中)

from django.db import models class BaseModel(models.Model):     '''     基类 公共字段     '''     create_time = models.DateTimeField('创建时间',auto_now_add=True)     update_time = models.DateTimeField('修改时间',auto_now = True)     is_delete = models.BooleanField('逻辑删除',default=False)     class Meta:         # 抽象类, 用于继承,迁移的时候不创建         abstract = True

对于抽象的模型如用户注册的AbstractUser,迁移时不应该创建

Meta

使用内部 Meta类 来给模型赋予元数据

# 这里的basemodel是上面的 class Teacher(BaseModel):     name = models.CharField('讲师姓名', max_length=150, help_text='讲师名字')     title = models.CharField('职称', max_length=150, help_text='职称')     profile = models.TextField('简介', help_text='简介')     photo = models.URLField('头像url', default='', help_text='头像url')     class Meta:         db_table = 'tb_teachers'         verbose_name = '讲师'         verbose_name_plural = verbose_name     def __str__(self):         return self.name

下面是Meta常用选项

abstract

这个属性是定义当前的模型是不是一个抽象类。所谓抽象类是不会对应数据库表的。如果abstract = True 这个model就是一个抽象类

app_label

这个选型只在一种情况下使用,就是你的模型不在默认的应用程序包下的models.py文件中,这时候需要指定你这个模型是哪个应用程序的。app_label = 'myapp'

db_table

db_table是指定自定义数据库表明的。Django有一套默认的按照一定规则生成数据模型对应的数据库表明。定义该model在数据库中的表名称db_table = 'Students'

get_latest_by

在model中指定一个DateField或者DateTimeField。这个设置让你在使用model的Manager上的lastest方法时,默认使用指定字段来排序

managed

默认值为True,这意味着Django可以使用syncdb和reset命令来创建或移除对应的数据库。默认值为True,如果你不希望这么做,可以把manage的值设置为False

order_with_respect_to

这个选项一般用于多对多的关系中,它指向一个关联对象,就是说关联对象找到这个对象后它是经过排序的。指定这个属性后你会得到一个get_xxx_order()和set_xxx_order()的方法,通过它们你可以设置或者回去排序的对象

ordering

这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的。这是一个字符串的元组或列表,没有一个字符串都是一个字段和用一个可选的表明降序的'-'构成。当字段名前面没有'-'时,将默认使用升序排列。使用'?'将会随机排列

ordering=['order_date'] # 按订单升序排列 ordering=['-order_date'] # 按订单降序排列,-表示降序 ordering=['?order_date'] # 随机排序,?表示随机 ordering=['-pub_date','author'] # 以pub_date为降序,在以author升序排列

permissions

permissions主要是为了在Django Admin管理模块下使用的,如果你设置了这个属性可以让指定的方法权限描述更清晰可读。Django自动为每个设置了admin的对象创建添加,删除和修改的权限。

permissions = (('can_deliver_pizzas','Can deliver pizzas'))

proxy

这是为了实现代理模型使用的,如果proxy = True,表示model是其父的代理 model

unique_together

unique_together这个选项用于:当你需要通过两个字段保持唯一性时使用。比如假设你希望,一个Person的FirstName和LastName两者的组合必须是唯一的,那么需要这样设置:unique_together = (("first_name", "last_name"),)

注意:一个ManyToManyField不能包含在unique_together中。

如果你需要验证关联到ManyToManyField字段的唯一验证,尝试使用signal(信号)或者明确指定through属性。

verbose_name

verbose_name的意思很简单,就是给你的模型类起一个更可读的名字一般定义为中文,我们: verbose_name = "学校"

verbose_name_plural

这个选项是指定,模型的复数形式是什么,比如verbose_name_plural = "学校"如果不指定Django会自动在模型名称后加一个’s’

字段类型

models.CharField

字符串类型。必须接收一个max_length参数.最常用的filed,没有之一!

models.TextField  

大量文本内容,在HTML中表现为Textarea标签,最常用的字段类型之一!

models.BooleanField

在HTML表单中体现为CheckboxInput标签。如果要接收null值,请使用NullBooleanField。

models.IntegerField

整数类型,最常用的字段之一。取值范围-2147483648到2147483647。在HTML中表现为NumberInput标签。优先级一般使用这个字段

models.URLField  

字符串类型,地址正则表达式,默认最大长度200。

models.BinaryField 

二进制数据类型。使用受限,少用。

models.ImageField   图片

models.FilePathField 文件

models.AutoField  自增列=int(11)

通常你不需要自己编写它,Django会自动帮你添加字段:id = models.AutoField(primary_key=True),如果没有的话,默认会生成一个名称为id的列,如果要显示的定义一个自增列,或者如果你非要自己设置主键,那么请务必将字段设置为primary_key=True。

注意:Django在一个模型中只允许有一个自增字段,并且该字段必须为主键!

models.DateField  日期字段类型date

注意:参数auto_now=True表示每次更新都会更新这个时间;参数auto_now_add表示只是第一次创建时添加,之后的更新不再改变

models.DateTimeField  

日期时间类型。Python的datetime.datetime的实例。与DateField相比就是多了小时、分和秒的显示,其它功能、参数、用法、默认值等等都一样

models.TimeField  

时间字段,Python中datetime.time的实例。HH:MM[:ss[.uuuuuu]]

models.Decimal  

十进制小数类型=decimal,必须指定整数位max_digits和小数位decimal_places

models.EmailField  

字符串类型(正则表达式邮箱)=varchar  对字符串进行正则表达式验证,使用DJango内置的EmailValidator进行邮箱地址合法性验证。

models.FloatField  

浮点类型=double

models.IntegerField  

整形

models.BigIntegerField 

长整形

integer_field_ranges = {     'SmallIntegerField': (-32768, 32767),     'IntegerField': (-2147483648, 2147483647),     'BigIntegerField': (-9223372036854775808, 9223372036854775807),     'PositiveSmallIntegerField': (0, 32767),     'PositiveIntegerField': (0, 2147483647),   }

models.IPAddressField  

字符串类型(ip4正则表达式)

models.GenericIPAddressField 

字符串类型(ip4和ip6是可选的)参数protocol可以是:both、ipv4、ipv6  验证时,会根据设置进行报错

models.NullBooleanField  

models.ComaSeparatedIntegerField  

用逗号分割的数字类型=varchar 继承CharField,所以必须加max_lenght参数

主要讲几个重要的字段

CharField 和

TextField

三个必要参数

名称

max_length

help_text

title = models.CharField('课程名', max_length=150, help_text='课程名') profile = models.TextField('课程简介', null=True, blank=True, help_text='课程简介')

改写字段传入validators参数改写的函数

null=True(默认是false,不能为空)

blank=True  表示代码中创建数据库记录时该字段可传空白(空串,空字符串).

default 默认为

FileField 和ImageField

上传文件字段(不能设置为主键)。默认情况下,该字段在HTML中表现为一个ClearableFileInput标签。

class MyModel(models.Model):     photo = ImageField(upload_to = 'photos/')     #实际的路径就是 MEDIA_ROOT/photos/filename     #所以可以用uoload_to来指定文件存放的前缀路径     #FileField也是同样的定义

height_field=None

width_field=None

height_field参数:保存有图片高度信息的模型字段名。width_field参数:保存有图片宽度信息的模型字段名。

DateTimeField

DateTimeField.auto_now

这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。

DateTimeField.auto_now_add

这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。

class BaseModel(models.Model):     '''     基类 公共字段     '''     create_time = models.DateTimeField('创建时间',auto_now_add=True)     update_time = models.DateTimeField('修改时间',auto_now = True)     is_delete = models.BooleanField('逻辑删除',default=False)     class Meta:         # 抽象类, 用于继承,迁移的时候不创建         abstract = True

字段常用参数

null

如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False

blank

如果为True时django的 Admin 中添加数据时可允许空值,可以不填。如果为False则必须填。默认是False。 null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的

primary_key = False

主键,对AutoField设置主键后,就会代替原来的自增 id 列

bauto_now 和 auto_now_add

auto_now   自动创建---无论添加或修改,都是当前操作的时间 auto_now_add  自动创建---永远是创建时的时间

choices

一个二维的元组被用作choices,如果这样定义,Django会select box代替普通的文本框, 并且限定choices的值是元组中的值

GENDER_CHOICE = (             (u'M', u'Male'),             (u'F', u'Female'),       )       gender = models.CharField(max_length=2,choices = GENDER_CHOICE)

max_length

字段长度

default

默认值

verbose_name  

Admin中字段的显示名称,如果不设置该参数时,则与属性名。

db_column  

数据库中的字段名称

unique=True  

不允许重复

db_index = True  

数据库索引

meditable=True

在Admin里是否可编辑

error_messages=None  

错误提示

auto_created=False    自动创建

help_text    在Admin中提示帮助信息

validators=[]

验证器

upload-to

文件上传时的保存上传文件的目录

模型关系

基本原则:

一对一的表,两表的属性实际上完全可以合并成一个表,共用一个主键即可;

一对多的表,可以设中间关联表,也可以将关联表并入“多”这头;若设独立关联表,则可引入“多”这头的主键作为其主键,也可另立主键并将“一”和“多”两表的主键作为关联表的外键;

多对多的表,则必须设中间关联表,关联表设独立主键,并引入两个“多”头的表的主键作为关联表的外键。

ForeignKey: 一对多 ManyToManyField:多对多 OneToOneField:    一对一

on_delete参数说明:

有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值

CASCADE:此值设置,是级联删除。

PROTECT:此值设置,是会报完整性错误。

SET_NULL:此值设置,会把外键设置为null,前提是允许为null。

SET_DEFAULT:此值设置,会把设置为外键的默认值。

SET():此值设置,会调用外面的值,可以是一个函数。

一对一:一个学生只有一个学号 一对多:一个学生有多个课程 多对多:多个学生有多个课程

一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择) 一个学院信息表有多个学生的信息表

再比如文章和作者之间的关系。一个文章只能由一个作者编写,但是一个作者可以写多篇文章。文章和作者之间的关系就是典型的多对一的关系。作者和文章的关系就是一对多。

多对多:在某表中创建一行数据是,有一个可以多选的下拉框 不同的学生有不同课程表

再比如文章和标签的关系。一篇文章可以有多个标签,一个标签可以被多个文章所引用。因此标签和文章的关系是典型的多对多的关系。

一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了) 一个学生信息表就只用一个对应的详细信息表

再比如一个用户表和一个用户信息表。在实际网站中,可能需要保存用户的许多信息,但是有些信息是不经常用的。如果把所有信息都存放到一张表中可能会影响查询效率,因此可以把用户的一些不常用的信息存放到另外一张表中我们叫做UserExtension。但是用户表User和用户信息表UserExtension就是典型的一对一了。

案例深入

在这里插入图片描述

一个学生只有一个学生的信息详细表,多个学生有多个课程,通过中间关联表就是学生报名表

在这里插入图片描述 在多对多中必须through=‘Enroll' 就是有Enroll表才能有课程表,想下没有学生报名还上什么课,必须设中间关联表就是学生报名表

在这里插入图片描述

如果没有学生,没有课程来报名上学干嘛,所以是多对一,多个学生合成一张报名表

注意:外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错! 一般使用CASCADE 表示级联删除

也就是有一个数据其中一个表删了,管聊的表就会删除,想下如果有个学生不读了,删掉了所有学生报名表中的数据,它绑的外键的学生,课程,是不是先把它删了,这就是级联删除,如果设置了SET_NULL就是把学生的信息删了,它人留下来,下次在补信息就ok了

def  str (self):

这个 str 的作用是美化打印出来的结果,使人类更方便查看

class Test:     def __init__(self, name, job):         self.name = name         self.job = job     def __str__(self):         return 'Name:' + self.name instance = Test('maoli', 'student') print(instance) Name: maoli

补充

# 必需字段 # 没有mobile就不行 REQUIRED_FIELDS = ['mobile']

一直原创,从未转载

请认准我, 将我置标

转发,好看支持一下,感谢


推荐阅读
  • 本文详细介绍了如何在 Django 项目中使用 Admin 管理后台,包括创建超级用户、启动项目、管理数据模型和修改用户密码等步骤。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • DRF框架中Serializer反序列化验证机制详解:深入探讨Validators的应用与优化
    在DRF框架的反序列化验证机制中,除了基本的字段类型和长度校验外,还常常需要进行更为复杂的条件限制校验。通过引入`validators`模块,可以实现自定义校验逻辑,如唯一字段校验等。本文将详细探讨`validators`的使用方法及其优化策略,帮助开发者更好地理解和应用这一重要功能。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 基于 Bottle 框架构建的幽默应用 —— Python 实践 ... [详细]
  • 使用多项式拟合分析淘宝双11销售趋势
    根据天猫官方数据,2019年双11成交额达到2684亿元,再次刷新历史记录。本文通过多项式拟合方法,分析并预测未来几年的销售趋势。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 本文详细介绍了如何使用Python中的smtplib库来发送带有附件的邮件,并提供了完整的代码示例。作者:多测师_王sir,时间:2020年5月20日 17:24,微信:15367499889,公司:上海多测师信息有限公司。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
author-avatar
最最后的力气撑起最灿烂的微笑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有