0
点赞
收藏
分享

微信扫一扫

9.django模型层,配置mysql,ORM,字段处理,Meta类


9.django模型层,配置mysql,ORM,字段处理,Meta类_字段

Django 配置mysql

安装依赖包

[root@mdns ~]#yum install python3-devel*

[root@mdns yum.repos.d]#wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
[root@mdns yum.repos.d]#ls
Centos-7.repo elrepo.repo mysql-community.repo mysql-community-source.repo

[root@mdns yum.repos.d]#yum install libmysqlclient*
[root@mdns yum.repos.d]#pip3 install mysqlclient
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting mysqlclient
Downloading https://files.pythonhosted.org/packages/de/79/d02be3cb942afda6c99ca207858847572e38146eb73a7c4bfe3bdf154626/mysqlclient-2.1.0.tar.gz (87kB)
100% |████████████████████████████████| 92kB 671kB/s
Installing collected packages: mysqlclient
Running setup.py install for mysqlclient ... done
Successfully installed mysqlclient-2.1.0
[root@mdns yum.repos.d]#pip3 freeze | grep -i 'mysql'
mysqlclient==2.1.0

创建数据库

mysql> create database mysite3 default charset utf8;
Query OK, 1 row affected (0.02 sec)

settings.py 进行数据库配置

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite3',
'USER': 'root',
'PASSWORD': 'Aa123ab!',
'HOST': 'localhost',
'PORT': '3306',
}
}

模型


  1. 模型是一个python类,它是由django.db.models.Model派生出的子类
  2. 一个模型类代表数据库中的一张数据表
  3. 模型类中每一个属性都代表数据库中的一个字段
  4. 模型是数据交互的接口,是表示和操作数据库的方法和方式

ORM


  1. 定义: ORM即对象关系映射,它是一种程序技术,允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
  2. 作用:


  • 建立模型类和表之间的对应关系,允许通过面向对象方式操作数据库
  • 根据设计的模型类生成数据库中的表格
  • 通过简单的配置可以进行数据库的切换



优点:只需要面向对象编程,不需要面向数据库;对数据库的操作都转换成对类属性和方法的操作;不用编写各种数据库的sql语句
实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异。



缺点:对于复杂业务,使用成本较高。根据对象的操作转换成SQL语句,然后查询的结果转化成对象,映射过程中有性能损失



映射图
类-表 对象-行 属性-字段
9.django模型层,配置mysql,ORM,字段处理,Meta类_python_02



添加模型

需求:添加library_book 表来存放图书馆图书信息

添加library应用

[root@sdns helloworld]# python3 manage.py startapp library
[root@sdns helloworld]# ls
bookstore db.sqlite3 helloworld manage.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'sport',
'news',
'library',
]

创建模型

from django.db import models

# Create your models here.


class Book(models.Model):
title = models.CharField("书名", max_length=50, default='')
price = models.DecimalField("价格",max_digits=7, decimal_places=2)

生成迁移表

迁移是Django同步对模型做更改(添加字段,删除模型等)到数据库的动作

生成迁移文件 - 执行 python3 manage.py makemigrations

将应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中

[root@sdns book]# python manage.py makemigrations
Migrations for 'library':
library/migrations/0001_initial.py
- Create model Book
[root@sdns book]#

执行迁移脚本程序 - 执行python3 manage.py migrate

执行迁移程序实现迁移。将每个应用下的migrations 目录中的中间文件同步回数据库

[root@sdns book]# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, library, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying library.0001_initial... OK
Applying sessions.0001_initial... OK

数据库查看

mysql> show tables;
+----------------------------+
| Tables_in_book |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| library_book |
+----------------------------+
11 rows in set (0.00 sec)

模型修改

任何关于表结构的修改,务必在对应模型类上修改。例如: 为library_book表 添加字段

from django.db import models

# Create your models here.

class Book(models.Model):
title = models.CharField("书名", max_length=50, default='')
price = models.DecimalField("价格",max_digits=7, decimal_places=2)
info = models.CharField("描述",max_length=100,default='')

回迁数据库

[root@sdns book]# python manage.py makemigrations
Migrations for 'library':
library/migrations/0002_book_info.py
- Add field info to book
[root@sdns book]# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, library, sessions
Running migrations:
Applying library.0002_book_info... OK

字段

字段类型

字段名

必选参数

意义

AutoField

一个能够根据可用ID自增的 IntegerField

BooleanField

一个真/假(true/false)字段,对应数据库类型tinyint(1)

CharField

(max_length)

一个字符串字段,适用于中小长度的字符串。对于长段的文字,请使用 TextField。对应数据库类型varchar

CommaSeparatedIntegerField

(max_length)

一个用逗号分隔开的整数字段

DateField

([auto_now], [auto_now_add], [default])

日期字段,对应数据库类型date,auto_now表示每次保存对象时,自动设置该字段为当前时间;auto_now_add:当对象第一次创建时自动设置当前时间;default:设置为当前时间

DateTimeField

数据库类型datetime(6)。表示日期和时间。

EmailField

一个能检查值是否是有效的电子邮件地址的 CharField

FileField

(upload_to)

一个文件上传字段

FilePathField

(path,[match],[recursive])

一个拥有若干可选项的字段,选项被限定为文件系统中某个目录下的文件名

FloatField

(max_digits,decimal_places)

一个浮点数,对应Python中的 float 实例

ImageField

(upload_to, [height_field] ,[width_field])

数据库类型 varchar(100). 作用在数据库中为了保存图片的路径

IntegerField

一个整数。

IPAddressField

一个IP地址,以字符串格式表示(例如: “24.124.1.30” )。

NullBooleanField

就像一个 BooleanField ,但它支持 None /Null 。

PhoneNumberField

它是一个 CharField ,并且会检查值是否是一个合法的美式电话格式

PositiveIntegerField

和 IntegerField 类似,但必须是正值。

PositiveSmallIntegerField

与 PositiveIntegerField 类似,但只允许小于一定值的值,最大值取决于数据库.

SlugField

嵌条 就是一段内容的简短标签,这段内容只能包含字母、数字、下划线或连字符。通常用于URL中

SmallIntegerField

和 IntegerField 类似,但是只允许在一个数据库相关的范围内的数值(通常是-32,768到 +32,767)

TextField

一个不限长度的文字字段.数据库类型longtext。表示不定长字符数据

TimeField

时分秒的时间显示。它接受的可指定参数与 DateField 和

URLField

用来存储URL的字段。

XMLField

(schema_path)

它就是一个 TextField ,只不过要检查值是匹配指定schema的合法XML。

字段选项

字段选项,是指创建的列时提供的额外信息。 允许出现多个字段选线,多个选项用逗号隔开。

Field

选项

null

null 缺省设置为false.通常不将其用于字符型字段上,比如CharField,TextField上.字符型字段如果没有值会返回空字符串。

blank

该字段是否可以为空。如果为假,则必须有值

choices

一个用来选择值的2维元组。第一个值是实际存储的值,第二个用来方便进行选择。 SEX_CHOICES= ((‘F’,‘Female’),(‘M’,‘Male’),) coredb_columndb_index 如果为真将为此字段创建索引

default

缺省值

editable

如果为假,admin模式下将不能改写。缺省为真

help_text

admin模式下帮助文档

primary_key

设置主键。如果没有设置django创建表时会自动加上

unique

数据唯一

AutoField

自动增长的整型字段。通常无需自己添加

DateField

参数:auto_now 自动设置为对象保存时刻的时间。对于类似最后改动之类的应用很有效

auto_now_add 从最初保存对象至今的增量时间

DateTimeField 同上EmailField

检查是否为email的CharField字段

FileField

保存文件的相对路径名称 绝对路径需要在setting中设置 MEDIA_ROOT。

FloatField

浮点数字段。两个必须选项 max_digits 数字最多位数 decimal_places 小数点位置 meta.FloatField(…,max_digits=5,decimal_places=2) /100.00 ImageField

db_index

设置为true,表示该列添加索引

db_column

指定列的名称,默认情况下,表的字段名和类的属性是一致。可以通过db_column 指定数据库的表中列名。通常不用给

verbose_name

设置字段在admin界面上显示的名称

样例

创建一个属性,表示用户名称,长度30个字符,必须唯一,不能为空,添加索引

name=models.CharField(max_length=30,unique=True,null=False,db_index=True)

生效

修改过的字段选项, 均要执行make migrations 和 migrate 。

class Author(models.Model):
# name-CharFiled ,后台显示姓名,长度11
name=models.CharField("姓名",max_length=11,default='')
# 年龄
age=models.IntegerField("年龄")
# 邮箱
email=models.IntegerField("邮箱")
[root@sdns zaishu]# python manage.py makemigrations
Migrations for 'bookstore':
bookstore/migrations/0003_author.py
- Create model Author
[root@sdns zaishu]# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, bookstore, contenttypes, sessions
Running migrations:
Applying bookstore.0003_author... OK
[root@sdns zaishu]#

模型类-Meta类

使用内部Meta类来给模型赋予属性,Meta类下有很多内建的类属性,可对模型类做一些控制

更改表名

class Book(models.Model):
title = models.CharField("书名", max_length=50, default='')
price = models.DecimalField("价格",max_digits=7, decimal_places=2)
class Meta:
db_table="booknew"
[root@zaishu zaishu]# python manage.py makemigrations
Migrations for 'bookstore':
bookstore/migrations/0002_auto_20220216_1821.py
- Rename table for book to booknew
[root@zaishu zaishu]# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, bookstore, contenttypes, sessions
Running migrations:
Applying bookstore.0002_auto_20220216_1821... OK

修改模型类

class Book(models.Model):
title = models.CharField("书名", max_length=50, default='', unique=True)
pub = models.CharField("出版社", max_length=100, default="")
price = models.DecimalField("价格", max_digits=7, decimal_places=2)
market_price = models.DecimalField(
"零售价", max_digits=7, decimal_places=2, default=0.0)

class Meta:
db_table = "booknew"
[root@zaishu zaishu]# python manage.py makemigrations
Migrations for 'bookstore':
bookstore/migrations/0003_auto_20220216_1828.py
- Add field market_price to book
- Add field pub to book
- Alter field title on book
[root@zaishu zaishu]# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, bookstore, contenttypes, sessions
Running migrations:
Applying bookstore.0003_auto_20220216_1828... OK

重建库


  1. 删除migrations里所有00?_xx.py(​init​.py文件除外)
  2. 删除数据库:drop database db
  3. 创建数据库: create database db default charset utf8
  4. 重新生成py文件: python mange.py makemigrations
  5. 更新数据库: python manage.py migrate


举报

相关推荐

0 条评论