前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【云+社区年度正文】Django从入门到精通No.2----模型

【云+社区年度正文】Django从入门到精通No.2----模型

原创
作者头像
Python进阶者
修改2020-11-30 10:18:13
2.1K0
修改2020-11-30 10:18:13
举报

django从入门到精通No.2----模型

一、前言

学过orm系统自然之道模型的重要性,很多web站点都需要与数据库交互,这个时候模型的设计就显得尤为重要,一个好的模型会使得项目方便管理并且易于维护,比如我们学过的flask,里面的sqlalchemy就是这样一个优秀的模块,通过它可以快速和数据库建立通道,从而使得web编程更为高效,本文主要讲解django的模型。

二、模型的定义

模型可以定义储存数据的字段和值,比如我们在进行表单提交的时候,一些注册信息就可以利用模型来进行管理,然后统一提交到数据库中。简单来说,模型是与数据库有关的操作集合。

三、模型的字段和约束

这里我们需要在he文件夹中找到models.py文件,然后我们试着改动一下这个文件的内容,如下:

代码语言:javascript
复制
from django.db import models
​
# Create your models here.
class book(models.Model):
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()

用于制作模型的每个类都必须继承models.Model类,然后我们会使用字段来对数据进行记录,django中有很多字段,如下:

字段类

默认小组件

说明

AutoField

N/A

根据 ID 自动递增的 IntegerField,必填参数primary_key=True,则成为数据库的主键,无该字段时,django自动创建,一个model不能有两个该字段。

BigIntegerField

NumberInput

64 位整数,与 IntegerField 很像,但取值范围是 -9223372036854775808 到 9223372036854775807 。

BinaryField

N/A

存储原始二进制数据的字段。只支持 bytes 类型。注意,这个字段的功能有限。

BooleanField

CheckboxInput

真假值字段。如果想接受 null 值,使用 NullBooleanField 。

CharField

TextInput

字符串字段,针对长度较小的字符串。大量文本应该使用 TextField 。有个额外的必须参数:max_length ,即字段的最大长度(字符个数)。

DateField

DateInput

日期,在 Python 中使用 datetime.date 实例表示。有两个额外的可选参数: auto_now ,每次保存对象时自动设为当前日期 auto_now_add ,创建对象时自动设为当前日期。两个参数不能和默认设置同时设置

DateTimeField

DateTimeInput

日期和时间,在 Python 中使用 datetime.datetime 实例表示。与 DateField 具有相同的额外参数。

DecimalField

TextInput

固定精度的小数,在 Python 中使用 Decimal 实例表示。有两个必须的参数: max_digits 和 decimal_places 。

DurationField

TextInput

存储时间跨度,在 Python 中使用 timedelta 表示。

EmailField

TextInput

一种 CharField ,使用 EmailValidator 验证输入。max_length 的默认值为 254 。

FileField

ClearableFileInput

文件上传字段。

FilePathField

Select

一种 CharField ,限定只能在文件系统中的特定目录里选择文件。

FloatField

NumberInput

浮点数,在 Python 中使用 float 实例表示。注意, field.localize 的值为 False 时,默认的小组件是 TextInput 。

ImageField

ClearableFileInput

所有属性和方法都继承自 FileField ,此外验证上传的对象是不是有效的图像。增加了 height 和 width 两个属性。需要 Pillow 库支持。

注:数据参考来源w3cschool

上面的字段很容易让人想起数据库中的数据类型,所以这些字段也就会有约束,常用的约束如下:

  • null:字段是否可以为空
  • blank:是否允许用户输入为空
  • db_column:字段的名称,如果未指定,则使用属性的名称
  • db_index:是否可以建立索引
  • default:默认值
  • primary_key:是否为主键
  • unique:否可以建立唯一索引
  • editable:字段是否可以编辑
  • help_text: 字段的提示信息
  • choices:显示选择框的内容,用不变动的数据放在内存中以避免跨表操作
  • verbose_name: 显示的字段名称
  • error_messages:自定义错误信息(字典类型)
  • validators:自定义错误验证(列表类型)

注:数据参考来源w3cschool

四、关联关系

django提供了三种数据库关联关系,即多对一,一对一,多对多,废话不多说,就是干。

1.多对一

因为是关联关系,所以我们必须指定两个类来进行相互操作,这里涉及到一个外键的操作,即ForeignKey字段,而且外键要定义在多的一方。我们先来创建两个类,如下:

代码语言:javascript
复制
from django.db import models
​
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
    bk=models.ForeignKey(book,on_delete=models.CASCADE)

ForeignKey提供了多个参数,如下:

代码语言:javascript
复制
ForeignKey()
    to                # 要进行关联的表名
    to_field=None     # 要关联的表中的字段名称
    on_delete=None    # 当删除关联表中的数据时,当前表与其关联的行的行为
                      - models.CASCADE,删除关联数据,与之关联也删除
                      - models.DO_NOTHING,删除关联数据,引发错误IntegrityError
                      - models.PROTECT,删除关联数据,引发错误ProtectedError
                      - models.SET_NULL 删除关联数据,与之关联的值设为null(前提FK字段需要设为可空)
                      - models.SET_DEFAULT 删除关联数据,与之关联的值设为默认值(前提FK字段设置默认值)
                        - models.SET,删除关联数据,
                               1. 与之关联的值设置为指定值,设置:models.SET(值)
                               2. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
    related_name=None      # 反向操作时,使用的字段名,用于代替表名_set
    related_query_name=None,# 反向操作时,使用的连接前缀,用于替换【表名】
    limit_choices_to=None,    # 在Admin或ModelForm中显示关联数据时,提供的条件,字典类型
    db_constraint=True          # 是否在数据库中创建外键约束
    parent_link=False           # 在Admin中是否显示关联数据

2.多对多

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

代码语言:javascript
复制
from django.db import models
​
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
    bk=models.ForeignKey(book,on_delete=models.CASCADE)
class title(models.Model):
    start=models.DateTimeField(default=timezone.now)
    end=models.DateTimeField(auto_now=True)
    p=models.ManyToManyField(book)

如果你想知道更多成员关系的细节,你可以指定一个中介模型来定义多对多关系,可以将其它字段放在中介模型中,源模型的字段使用through参数指向中介模型。如下:

代码语言:javascript
复制
from django.db import models
from django.utils import timezone
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
class title(models.Model):
    start=models.DateTimeField(default=timezone.now)
    end=models.DateTimeField(auto_now=True)
    p=models.ManyToManyField(people,through='zj')
class zj(models.Model):
    bk=models.ForeignKey(book,on_delete=models.CASCADE)
    p=models.ForeignKey(people,on_delete=models.CASCADE)
    dt=models.Datefield()

所有参数如下:

代码语言:javascript
复制
ManyToManyField()
    to                         # 要进行关联的表名
    related_name=None          # 反向操作时,使用的字段名,用于代替表名_set
    related_query_name=None    # 反向操作时,使用的连接前缀,用于替换表名
    limit_choices_to=None      # 在Admin或ModelForm中显示关联数据时,提供的条件,字典类型
    symmetrical=None            # 仅用于多对多自关联时,用于指定内部是否创建反向操作的字段,boolean类型
    through=None                # 自定义第三张表时,使用字段用于指定关系表
    through_fields=None         # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表
    db_constraint=True          # 是否在数据库中创建外键约束
    db_table=None              # 默认创建第三张表时,数据库中表的名称

3.一对一

一对一其实就是 一对多 + 唯一索引,当两个类之间有继承关系时,默认会创建一个一对一字段,一对一使用OneToOneField来实现,如下:

代码语言:javascript
复制
from django.db import models
​
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
    b=models.OneToOneField(book)

它里面的参数如下:

代码语言:javascript
复制
OneToOneField()
    to                 # 要进行关联的表名
    to_field=None      # 要关联的表中的字段名称
    on_delete=None     # 当删除关联表中的数据时,当前表与其关联的行的行为

五、管理员登陆

为了能让大家提前看到django的数据操作,django内置了一款非常到位的系统管理员登陆设计系统,首先我们创建下用户,如下:

代码语言:javascript
复制
python manage.py createsuperuser

然后我们按照要求一步步设置参数,如图:

然后我们启动服务器并且进入到下图这个页面中去,如图:

然后我们利用刚刚设置好的用户名和密码来进行登陆,如图:

可以看到,已经进入到系统中了。

六、总结

以上就是django所有的关于模型的概念了,接下来小编将通过与数据库交互来带着大家一起操作表。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • django从入门到精通No.2----模型
    • 一、前言
      • 二、模型的定义
        • 三、模型的字段和约束
          • 四、关联关系
            • 1.多对一
            • 2.多对多
            • 3.一对一
        • 五、管理员登陆
          • 六、总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档