热门标签 | 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']

一直原创,从未转载

请认准我, 将我置标

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


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
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社区 版权所有