django model
发布日期:2021-07-01 02:02:07 浏览次数:2 分类:技术文章

本文共 8140 字,大约阅读时间需要 27 分钟。

本文一篇完全介绍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']

转载地址:https://maoli.blog.csdn.net/article/details/101025714 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Elasticsearch(一)
下一篇:webpack 语法

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月09日 11时15分47秒