热门标签 | 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 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • Django xAdmin 使用指南(第一部分)
    本文介绍如何在Django项目中集成和使用xAdmin,这是一个增强版的管理界面,提供了比Django默认admin更多的功能。文中详细描述了集成步骤及配置方法。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • cJinja:C++编写的轻量级HTML模板引擎
    本文介绍了cJinja,这是一个用C++编写的轻量级HTML模板解析库。它利用ejson来处理模板中的数据替换(即上下文),其语法与Django Jinja非常相似,功能强大且易于学习。 ... [详细]
  • 本文介绍如何在Django项目中利用UpdateView更新数据后,根据主键(pk)自动重定向至对应的DetailView页面,实现流畅的用户交互体验。 ... [详细]
  • 日志记录对于软件开发至关重要,特别是在调试和维护阶段。通过日志,开发者能够追踪错误源头并了解系统的运行状态。本文将探讨如何在Django框架中有效配置和使用日志记录功能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
  • Django 使用slug field时遇到的问题 ... [详细]
  • 本文介绍了如何在Django项目中使用django-crontab库来设置和管理定时任务,包括安装、配置、编写定时任务以及常见问题的解决方案。通过具体实例,帮助开发者快速掌握在Django中实现自动化任务的方法。 ... [详细]
  • 本文详细介绍如何结合Django框架和DRF(Django REST Framework)来设计一套有效的全局异常处理系统。这套系统不仅能够妥善处理DRF引发的异常,还能兼容Django自带的admin界面异常处理逻辑。 ... [详细]
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社区 版权所有