Python学习第127天(Django至ORM)
2021-04-21 06:29
标签:今天 django choices 设置 image 作者 告诉 comm list 本来今天是打算和实际操练相结合进行展示的,可是,工作电脑的admin权限始终影响,导致pymysql包导入一直失败,导致没法实际开始,今天就暂时先空谈一下。 首先要说的是Python3这里支持的是sqlite,但是我们这里学习pymysql的原因是为了更好的将Python语言和数据库之间建立连接,从而保证可以岁python走,便于操作。 django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3 如果我们想要更改数据库,需要修改如下: 之后我们就使用orm来进行数据库的操作,那么这个和原生的sqlite的mysql之间有什么区别呢? 先说优点: 1. ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来。 2.可以避免一些新手程序猿写sql语句带来的性能问题。 缺点: 1.性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。效果很显著。 2.对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。 3.通过QuerySet的query属性查询对应操作的sql语句 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名。 作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模型之间是一对一的关系(one-to-one)(类似于每个人和他的身份证之间的关系),在大多数情况下我们没有必要将他们拆分成两张表,这里只是引出一对一的概念。 出版商模型:出版商有名称,地址,所在城市,省,国家和网站。 书籍模型:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many),也被称作外键。 注意1:记得在settings里的INSTALLED_APPS中加入‘app01‘,然后再同步数据库。 注意2: models.ForeignKey("Publish") & models.ForeignKey(Publish) 下面是模型常用的字段类型参数 明天时间比较充裕,修理好pymysql的问题,再进行实操练习。 Python学习第127天(Django至ORM) 标签:今天 django choices 设置 image 作者 告诉 comm list 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13281991.html 在django的项目中会默认使用sqlite数据库,在settings里有如下设置:
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘,
‘NAME‘: ‘books‘, #你的数据库名称
‘USER‘: ‘root‘, #你的数据库用户名
‘PASSWORD‘: ‘‘, #你的数据库密码
‘HOST‘: ‘‘, #你的数据库主机,留空默认为localhost
‘PORT‘: ‘3306‘, #你的数据库端口
}
}
NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建
USER和PASSWORD分别是数据库的用户名和密码。
设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。
然后,启动项目,会报错:no module named MySQLdb
这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL
所以,我们只需要找到项目名文件下的__init__,在里面写入:import pymysql
pymysql.install_as_MySQLdb()
下面使用实际的表(模型)的创建:
from django.db import models
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.title1> CharField
#字符串字段, 用于较短的字符串.
#CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.
2> IntegerField
#用于保存一个整数.
3> FloatField
# 一个浮点数. 必须 提供两个参数:
#
# 参数 描述
# max_digits 总位数(不包括小数点和符号)
# decimal_places 小数位数
# 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
#
# models.FloatField(..., max_digits=5, decimal_places=2)
# 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
#
# models.FloatField(..., max_digits=19, decimal_places=10)
# admin 用一个文本框("text">)表示该字段保存的数据.
4> AutoField
# 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
# 自定义一个主键:my_id=models.AutoField(primary_key=True)
# 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.
5> BooleanField
# A true/false field. admin 用 checkbox 来表示此类字段.
6> TextField
# 一个容量很大的文本字段.
# admin 用一个