Python学习第127天(Django至ORM)

2021-04-21 06:29

阅读:818

标签:今天   django   choices   设置   image   作者   告诉   comm   list   

本来今天是打算和实际操练相结合进行展示的,可是,工作电脑的admin权限始终影响,导致pymysql包导入一直失败,导致没法实际开始,今天就暂时先空谈一下。

首先要说的是Python3这里支持的是sqlite,但是我们这里学习pymysql的原因是为了更好的将Python语言和数据库之间建立连接,从而保证可以岁python走,便于操作。

 django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3

 在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()

之后我们就使用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),也被称作外键。


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.title

注意1:记得在settings里的INSTALLED_APPS中加入‘app01‘,然后再同步数据库。

注意2: models.ForeignKey("Publish") & models.ForeignKey(Publish)

下面是模型常用的字段类型参数

1> 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 用一个 

明天时间比较充裕,修理好pymysql的问题,再进行实操练习。

Python学习第127天(Django至ORM)

标签:今天   django   choices   设置   image   作者   告诉   comm   list   

原文地址:https://www.cnblogs.com/xiaoyaotx/p/13281991.html


评论


亲,登录后才可以留言!