Django model 层之Models与Mysql数据库小结2

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Django model 层之Models与Mysql数据库小结

 

DecimalField

用Python Decimal实例表示的固定精度的数字。有两个必填参数:

 

DecimalField.max_digits

表示允许的最大值。必须大于等于decimal_spaces

 

DecimalField.decimal_places

设置精度位数。

 

比如field存储最大值不超过999,2位小数,设置如下:

models.DecimalField(..., max_digits=5, decimal_places=2)

该field对应的默认表单组件:当设置localize为False,则对应NumberInput,否则TextInput。

DurationField

存储以python timedelat表示的一段时间

 

EmailField

一个CharField,校验值是否是合法的email地址。使用EmailValidator校验输入值。

FileField

file-upload field。

注意:主键列不支持该类型。

更多详情参考官方文档。

 

FilePathField

一个CharField,可取值限制于系统上某个目录中的文件名

更多详情参考官方文档。

FloatField

python float实例表示的浮点数。

该field对应的默认表单组件:当设置localize为False,则对应NumberInput,否则TextInput。

 

ImageField

继承了FileField的所有属性和方法。校验上载对象是否是合法的图片。

更多详情参考官方文档。

IntegerField

整数。值从-2147483648 到2147483647,支持所有数据库。

该field对应的默认表单组件:当设置localize为False,则对应NumberInput,否则TextInput。

GenericIPAddressField

字符串格式(例如:192.0.2.30 or 2a02:42fe::4)表达的IPv4或IPv6地址,,针对IPv6,所有字符都会转为小写。

该field对应的默认表单组件:TextInput。

 

更多详情参考官方文档。

 

NullBooleanField

类似BooleanField,不同之处在于运行NULL值。等同BooleanField(...,null=True)。

该field对应的默认表单组件为NullBooleanSelect。

 

PositiveIntegerField

类似IntergerField,不同在于只接受正数,或者0.可取值范围:0 到2147483647

 

PositiveSmallIntegerField

类似PositiveIntegerField,可取值范围: 0 到 32767

 

SlugField

更多详情参考官方文档。

 

SmallIntegerField

类似IntegerField,取值范围:-32768 到 32767

 

TextField

大文本field。如果指定max_length属性,将作用于组件,但是不会是在数据库、model层起作用(If you specify a max_length attribute, it will be reflected in the Textarea widget of the auto-generated form field. However it is not enforced at the model or database level)。

该field对应的默认表单组件为:Textarea。

 

URLField

针对URL的CharField。可选参数:max_length,设置最大长度。默认200.

field对应的默认表单组件为:TextInput

 

UUIDField

存储全球唯一标识(universally unique identifier)。使用Python的UUID类。

对于主键AutoField来说,UUIDFeild是个很好的选择。但是数据库不会生成UUID,所以推荐使用default,如下:

import uuidfrom django.db import models

 

class MyUUIDModel(models.Model):

   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

# other fields

 

 

参考链接:

https://docs.djangoproject.com/en/1.11/ref/models/fields/#model-field-types

 

 

 

常用Field option

null

如果设置null=True,保存数据到数据库时,把“空值”存储为NULL。默认null=False。

 

blank

如果设置blank=True, 允许Field值为空,字符型字段CharField和TextField是用空字符串来存储空值的。默认False

 

注意:

blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填。

null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空,那么在新建一个model对象的时候是不会报错的!!

 

choice

一个由多个2元组,组成的可迭代对象(如tuple、list)。

 

如果设置了该选项值,那么默认的表单组件将变为一个select box,而不是标准是text field,且将被限制从给定choice中选择choice。

choice 列表,形如以下:

YEAR_IN_SCHOOL_CHOICES = (

   ('FR', 'Freshman'),

   ('SO', 'Sophomore'),

   ('JR', 'Junior'),

   ('SR', 'Senior'),

   ('GR', 'Graduate'),)

 

每个元组中第一个元素,将被存储在数据库中,第二个元素用于默认表单组件展示

 

例:

from django.db import models

class Person(models.Model):

   SHIRT_SIZES = (

       ('S', 'Small'),

       ('M', 'Medium'),

       ('L', 'Large'),

   )

   name = models.CharField(max_length=60)

   shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

 

>>> p = Person(name="Fred Flintstone", shirt_size="L")

>>> p.save()

>>> p.shirt_size

'L'

>>> p.get_shirt_size_display()

'Large'

 

default

设置field的默认值。可以是可调用对象,也可以是某个值。如果是可调用对象,每次创建对象,都会被调用

 

help_text

同表单组件一起展示的帮助说明

 

primary_key

如果设置primary_key=True,那么该field将是model的主键

 

主键Field只读。如果修改某个已存在对象,主键列的值,并保存该对象,会在旧对象的基础上,重新构建一个对象。

 

例:

from django.db import models

 

class Fruit(models.Model):

name = models.CharField(max_length=100, primary_key=True)

 

>>> fruit = Fruit.objects.create(name='Apple')

>>> fruit.name = 'Pear'

>>> fruit.save()

>>> Fruit.objects.values_list('name', flat=True)

<QuerySet ['Apple', 'Pear']>

 

unique

如果设置unique=True,则该field不允许有重复值。

 

参考链接:

https://docs.djangoproject.com/en/1.11/topics/db/models/#field-options

 

关联关系

 

外键关联

假设artist model对应mysql表为 myapp_album, Musician model对应的mysql表为Musician表为myapp_musician,则以下field定义,会使两个mysql表建立外键关联关系。myapp_album.artist列引用mapp_musician.auto_id字段的值,即mapp_musician.auto_id为myapp_album表的外键。

 

class Album(models.Model):

   artist = models.ForeignKey(Musician, to_field='auto_id', on_delete=models.PROTECT)

 

为方便理解,如上,暂时把Album、Musician Model称之为表,对应Model对象称之为表记录,存在外键关联的两个表,分别称之为参照表(如上的Album),被参照表(如上的Musician)

 

假设Musician代码位于 Album代码之前,那么执行以上代码时将报错,因为那会还没有定义Musician,如果不调整代码顺序,即定义表的先后顺序,那怎么办呢?

解决方案:把关联表写成字符串形式,如下:

 

class Album(models.Model):

   artist = models.ForeignKey('Musician', to_field='auto_id', on_delete=models.PROTECT)

 

自身关联

假设有表appame_resource,结构如下,其中parent的值如果不为NULL则为某条记录的id值

id name parent

1  xxx1  NULL

2  xxx2   1

 

这种情况则需要进行自身表关联设计,model设计如下:

class Resource(models.Model):

   id = models.AutoField(primary_key=True, verbose_name='资源ID')

   parent = models.ForeignKey('self', to_field='id', null=True, blank=True, on_delete=models.CASCADE)

   name = models.CharField(max_length=20, verbose_name='资源名称')

 

null参数值说明:该值默认为False,设置为True则表示允许字段为null,空值将被存储为NULL

blank参数值说明:该值默认为False,设置为True则表示允许字段为空值

 

on_delete参数值说明:

2.0版本,该参数值必填,更早之前的版本则默认为CASCADE。

可选值:

 

CASCADE

级联删除。模拟sql约束 ON DELETE CASCADE。删除被参照表的某条表记录,同时级联删除参照表中,同待删除记录存在外键关联关系的记录。

 

PROTECT

删除被参照表中的某条表记录,如果参照表中,存在与该记录有外键关系的记录,则不让删除。

 

SET_NULL

删除被参照表的某条表记录,设置参照表中,同待删除记录存在外键关联的记录的外键列值为null。当且仅当设置了null=True选项时可用。

 

SET_DEFAULT

删除被参照表的某条表记录,设置参照表中,同待删除记录存在外键关联的记录的外键列值为默认值。必须为外键列设置默认值。

 

SET()

删除被参照表的某条表记录,设置参照表中,同待删除记录存在外键关联关系的记录的外键列值为传递给SET()的参数值,如果传递给SET()的参数值是可调用对象,则设置为调用可调用对象获取的结果。

 

官方例子:

from django.conf import settings

from django.contrib.auth import get_user_model

from django.db import models

def get_sentinel_user():

   return get_user_model().objects.get_or_create(username='deleted')[0]

 

class MyModel(models.Model):

   user = models.ForeignKey(

       settings.AUTH_USER_MODEL,

       on_delete=models.SET(get_sentinel_user),

   )

 

DO_NOTHING

删除被参照表的某条表记录,不对参照表中同待删除记录存在外键关联的记录做任何处理。

 

 

 

参考链接:

https://docs.djangoproject.com/en/1.11/ref/models/fields/#foreignkey

参考链接:

https://docs.djangoproject.com/en/1.11/topics/db/models/#relationships

 

 

联合主键

例子:如下,希望project_id和user_id字段组合唯一

class APIProjectFacorites(models.Model):

   id = models.AutoField(primary_key=True, verbose_name='自增id')

   project_id = models.CharField(blank=True, null=True, max_length=300, verbose_name='项目id')

   user_id = models.CharField(blank=True, null=True, max_length=15, verbose_name='用户id')

 

   class Meta:

       db_table = 'tb_api_project_facorities'

       unique_together = ("project_id", "user_id")

       verbose_name = 'API项目收藏表'

       verbose_name_plural = verbose_name

 

 

组织models

1、如果manager.py 启动app,会创建包含一个models.py的文件。如果有许多model,可以按单个文件的方式组织model。新建models包来管理,具体方法如下:

 

然后移除models.py,并创建一个myapp/models目录,在该目录下新建__init__.py文件,用于存放models。

 

例:

假设在models目录下存在models文件,organic.py 和synthetic.py,编辑myapp/models/__init__.py,新增以下内容:

from .organic import Person

from .synthetic import Robot

 

 

 

参考链接:

https://docs.djangoproject.com/en/1.11/topics/db/models/

 

https://docs.djangoproject.com/en/1.11/

 

 

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
18天前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
5天前
|
ARouter 关系型数据库 MySQL
Django项目同时连接多个不同的数据库(7)
【7月更文挑战第7天】在Django项目中配置连接多个数据库,你需要: 1. 在`settings.py`中配置多个数据库, 2. 在`settings.py`内设置数据库路由,指定每个应用使用的数据库,
18 2
|
7天前
|
关系型数据库 MySQL 数据库连接
Django如何修改项目名,修改数据库(5)
【7月更文挑战第5天】 ### 项目迁移与数据库更换步骤 1. 修改项目目录和配置文件名。 2. 更新`manage.py`中的模块名。 3. 全局替换`settings.py`中的旧项目名。 4. 删除旧路由配置。 5. 在`settings.py`中更新`DATABASES`,配置新的数据库连接(如MySQL)。 6. 从`INSTALLED_APPS`和可能的`DATABASE_APPS_MAPPING`中移除无用模块。
14 3
|
6天前
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
12 1
|
8天前
|
数据库 Python
Django数据库类库MySQLdb使用详解
在Django中使用MySQLdb数据库类库,需要遵循以下步骤: 1. 安装MySQLdb:首先,需要在你的Python环境中安装MySQLdb类库。可以使用pip工具进行安装,命令如下:`pip install mysqlclient` 1. 配置Django数据库设置:在Django的settings.py文件中,需要配置DATABASES字典,用于指定使用MySQLdb以及数据库的相关信息。配置样例如下: ``` DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',
14 3
|
19天前
|
关系型数据库 MySQL 数据库
Django与MySQL:配置数据库的详细步骤
Django与MySQL:配置数据库的详细步骤
|
17天前
|
关系型数据库 MySQL 数据库
『Django』模型入门教程-操作MySQL
一个后台如果没有数据库可以说废了一半。日常开发中大多数时候都在与数据库打交道。Django 为我们提供了一种更简单的操作数据库的方式。 在 Django 中,模型(Model)是用来定义数据库结构的类。每个模型类通常对应数据库中的一个表,类的属性对应表中的列。通过定义模型,Django 的 ORM(Object-Relational Mapping)可以将 Python 对象映射到数据库表,并提供一套 API 来进行数据库操作。 本文介绍模型的用法。
|
19天前
|
JSON 缓存 数据库
Django ORM的QuerySet:解锁数据库交互的魔法钥匙
Django ORM的QuerySet:解锁数据库交互的魔法钥匙
|
20天前
|
XML 关系型数据库 数据库
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
54 0
|
存储 关系型数据库 MySQL
Django配置mysql数据库
Django配置mysql数据库