ORM
面向对象的的方式去操作数据库的创建表以及增删改查等操作
优点:ORM使得通用的数据库变得更加的简单,不用去考虑所谓的SQL语句。
通过在Django中创建表来进一步解释(这里用到的数据库是MySQL)
因为我们用到的是MySQL所以必须连接的是MySQL的数据库进行同步,在项目的__init__py文件设置Django连接数据库
import pymysql
pymysql.install_as_MySQLdb()
在settings中对DATABASES进行修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':"mysite",
'USER':"root",
'PASSWORD':"password",
'HOST':'192.168.182.182',
'PORT':'3306',
}
}
在连接数据库之前需要做的是在settings里的INSTALLED_APPS中加入“app名”,然后同步数据库
INSTALLED_APPS = [
'app01.apps.App01Config',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
在models.py中进行建表:
from django.db import models<br>
class Publisher(models.Model):
name = models.CharField(max_length=30, verbose_name="名称")
address = models.CharField("地址", max_length=50)
city = models.CharField('城市',max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Meta:
verbose_name = '出版商'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
class AuthorDetail(models.Model):
sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),))
email = models.EmailField()
address = models.CharField(max_length=50)
birthday = models.DateField()
author = models.OneToOneField(Author)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
def __str__(self):
return self.title
最后进行数据的迁移需要在终端输入以下两行代码:
1.通过app文件下的migrations目录记录,检测models.py中的di代码是否发生变化。
>>>pyhton manage.py makemigrations
2.把ORM代码转化成SQL语句去操作数据库。
>>>python manage.py migrate
此时打开mysql将会看到自己所创建的表。
以上用到了那么多的参数不妨我们在这里进行总结:
字符串类:
- CharField:(表示比较短的字符串要求必须有一个参数max_length=,数据库层和Django层校验字段所允许的最大字符串)
- TextField:(一个容量很大的文本字段,用<textarea>表示该字段数据)
- EmailField:(带有检查email合法性的字段)
- ImageField:(验证上传对象是否会合法的照片,有两个可选参数:height_field,width_field)
- FileField:(文件上传字段,要求必须有参数:upload_to,一个保存上载文件的本地文件路径)
- URLField:(用于保存URL)
- IPAddressField:(一个字符串形式的IP地址)
- CommaSeparatedIntegerField:(用于存放逗号分隔符分开的整数,必须要有max_length)
时间段:
- DataTimeField:(日期时间字段)
- DataField:(一个日期字段,可选参数为:Argument 描述,auto_now对象被保存时时间设置为当前时间)
数字字段:
- IntegerField:(用于保存一个整数)
- FloatField:(保存一个浮点数,必须有两个参数:max_digits:总位数,decimal_places:小数位数)
- AutoField:(一个IntegerField,添加记录时会自动增长,一般不需要直接使用这个字段,自定义一个主键必须要有的参数为:primary_key=Ture
枚举字段:
choice = ( (1,'football'), (2,'basketball'), (3,'others')) ball = models.IntegerField(choices = choice)
模型之间的关系有三种:一对一,一对多,多对的。
一对一:就是主外键的基础上,给外键加了一个UNIQUE=Ture的属性
一对多:就是主键与外键的关系
多对多:自动创建第三张表。