django.db.models.Model
可以直接继承,也可以间接继承。Model 中的所有字段都是django.db.models.Field
的子类,Django 会根据 Field 的类型确定数据库表的字段类型。Django 内置了数十种 Field 字段类型。
class Book(models.Model): #创建 book 表 title=models.CharField( max_length=30,unique=True, verbose_name='书名') public=models.CharField(max_length=50,verbose_name='出版社') price=models.DecimalField(max_digits=7,decimal_places=2,verbose_name='定价') def default_price(self): return '¥30' retail_price=models.DecimalField(max_digits=7,decimal_places=2,verbose_name='零售价',default=default_price) def __str__(self): return "title:%s pub:%s price:%s" % (self.title, self.public, self.price) class Author(models.Model): #创建作者表 name=models.CharField(max_length=30,verbose_name='姓名') email=models.EmailField(verbose_name='邮箱') def __str__(self): return '作者:%s'%(self.name) class UserInfo(models.Model): #创建用户信息表 username=models.CharField(max_length=24,verbose_name='用户注册') password =models.CharField(max_length=24,verbose_name='密码')通过上述代码,我们定义了一个名叫 Book 的数据表。数据表由以下字段构成书名(title)、出版社(public)、价格(price)、零售价(retail_price),而且对每个字段都做添加了相应的字段属性以及字段选项。
提示:数据库层面对待对待唯一性约束会创建唯一性索引,所以,如果一个字段设置了 unique=True,就不需要对这个字段加上索引选项了。
提示:对于 CharFiled 和 TextFiled 这样的字符串类型,null 字段应该设置为 False,如果为 Ture,对于空数据就会有两种概念。
# 创建表 class UserInfo(models.Model): # 定义chocies参数的对应关系,以元组(或者列表)的形式进行表述: choices = ( (male, '男性'), (female, '女性'), ) gender = models.CharField(max_length=2,choices = choices,default='male')
python manage.py makemigrations python manage.py migrate执行完毕后会在 CMD 命令行得到如下输出:
C:\Users\Administrator\Book\BookStore>python manage.py makemigrations Migrations for 'index': index\migrations\0001_initial.py - Create model Author - Create model Book - Create model UserInfo C:\Users\Administrator\Book\BookStore>python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, index, sessions Running migrations: Applying index.0001_initial... OK若迁移过程中出现报错提示,首先检查您的 models.py 文件是否正确书写,除此之外,也可能由于 Django 与 MySQL 版本问题导致报错,此时需要更改 Django 源码包,请参考如下文章《Django数据同步问题解决》。
# Generated by Django 2.2.10 on 2020-04-07 13:03 from django.db import migrations, models import index.models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Author', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=30, verbose_name='姓名')), ('email', models.EmailField(max_length=254, verbose_name='邮箱')), ], ), migrations.CreateModel( name='Book', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=30, unique=True, verbose_name='书名')), ('pub', models.CharField(max_length=50, verbose_name='出版社')), ('price', models.DecimalField(decimal_places=2, max_digits=7, verbose_name='定价')), ('retail_price', models.DecimalField(decimal_places=2, default=index.models.Book.default_price, max_digits=7, verbose_name='零售价')), ], ), migrations.CreateModel( name='UserInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('Username', models.CharField(max_length=24, verbose_name='用户注册')), ('password', models.CharField(max_length=24, verbose_name='密码')), ('gender', models.CharField(choices=[('M', '男性'), ('F', '女性')], default='M', max_length=2)), ], ), ]这个迁移文件包含了创建数据表时用到的所有信息,这是一个临时的过度文件,在执行完 makemigrations 命令后生成。我们可以使用如下命令打印迁移文件执行的 SQL 语句:
python manage.py sqlmigrate index 0001_initial
输出如下所示:C:\Users\Administrator\Book\BookStore>python manage.py sqlmigrate index 0001_initial BEGIN; -- -- Create model Author -- CREATE TABLE `index_author` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(30) NOT NULL, `email` varchar(254) NOT NULL); -- -- Create model Book -- CREATE TABLE `index_book` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `title` varchar(30) NOT NULL UNIQUE, `pub` varchar(50) NOT NULL, `price` numeric(7, 2) NOT NULL, `retail_price` numeric(7, 2) NOT NULL); -- -- Create model UserInfo -- CREATE TABLE `index_userinfo` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `Username` varchar(24) NOT NULL, `password` varchar(24) NOT NULL, `gender` varchar(2) NOT NULL); COMMIT;sqlmigrate 命令后紧跟应用名和文件的名字,这个命令不会实现数据库的最终迁移,它只是将 SQL 语句打印输出到命令行中。 最终我们使用 migrate 命令将 index 应用的模型类(models)转换成数据库中的数据表。
# 直接print打印 class TestClass: def __init__(self): self.name = 'testcase' t = TestClass() #实例化对象 print(t) # 结果显示:<__main__.TestClass object at 0x8f5c27b42367> # __str__方法 class TestClass: def __init__(self): self.name = '小明' def __str__(self): return self.name t = TestClass() #实例化对象 print(t) # 结果显示:小明
不仅如此 __str__ 方法在 admin 后台系统也发挥着巨大的作用,它会将函数的返回值作为对象来显示。
本节内容为 index 应用创建了数据表,并且一步步带领大家实现了如何自定义模型类以及完成了数据表的迁移的,而且对产生的迁移文件也做了介绍,在下一节,我们将再次学习 Django 的后台管理系统,看看它是如何配合 ORM 使用的。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有