Django框架(2)

五、静态文件配置

Django的常用的三种静态文件的配置方式

(1)settings配置引入静态文件

  • 在settings.py中配置

    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'statics'),  # statics为创建的静态文件夹
    ]
    
  • 在前端文件导入的时候使用settings.py中的STATIC_URL = '/static/'的static路径引入

<!-- html代码 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/css/index.css">
</head>
<body>
<div class="c">hello world!</div>
</body>
</html>

<!-- inde.css代码 -->
.c{
    height: 100px;
    width: 100px;
    border: 1px solid black;
    background-color: aqua;
    color: aliceblue;
}
# settings中的配置

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'statics'),
]

(2)template渲染模式static引入静态文件

  • 通过模板渲染在html文件头部引入{% load static %}
  • 引入文件方式:<link rel=“stylesheet” href="{% static “文件路径” %}">
<!-- html代码 -->
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static "css/index.css" %}">
</head>
<body>
<div class="c">hello world!</div>
</body>
</html>

<!-- inde.css代码 -->
.c{
    height: 100px;
    width: 100px;
    border: 1px solid black;
    background-color: aqua;
    color: aliceblue;
}

(3)template渲染模式get_static_prefix引入静态文件

  • 通过模板渲染在html文件头部引入{% load static %}
  • 引入文件方式:<link rel=“stylesheet” href="{% get_static_prefix %}文件路径 ">
  • 注:路径和大括号之间不能有空格, %}文件路径,要无缝对接,否则无法引入文件
<!-- html代码 -->
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% get_static_prefix %}css/index.css ">
</head>
<body>
<div class="c">hello world!</div>
</body>
</html>

<!-- inde.css代码 -->
.c{
    height: 100px;
    width: 100px;
    border: 1px solid black;
    background-color: aqua;
    color: aliceblue;
}

六、ORM(对象关系映射)

ORM全称:object relational mapping ---- 对象 关系 映射

主要完成的就是数据库操作。

  • MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
  • ORM是“对象-关系-映射”的简称。(Object Relational Mapping,简称ORM)(将来会学一个sqlalchemy,是和他很像的,但是django的orm没有独立出来让别人去使用,虽然功能比sqlalchemy更强大,但是别人用不了)
  • 类对象—>sql—>pymysql—>mysql服务端—>磁盘,orm其实就是将类对象的语法翻译成sql语句的一个引擎,明白orm是什么了,剩下的就是怎么使用orm,怎么来写类对象关系语句。
1、model类的属性参数
比如:models.CharField(null=True,blank=True)
(1)null
	如果null=True,Django将用NULL来在数据库中存储值。默认情况null=False
(2)blank
	如果blank=True,该字段允许不填,默认blank=False
	需要注意,null与default不同;null是数据库范畴,blank是数据验证范畴
(3)dfault
	设置字段默认值,可以是一个值或者可调用对象。
	如果可调用,每有新对象被创建它都会被调用,如果字段没有设置可以为空,那么当进行添加新字段操作时要加上default默认值,否则会有操作提示,让你添加默认值。
(4)primary_key
	主键,当primary_key=True就是为当前字段添加主键。
	如果表中没有设置primary_key=True,Django会自动添加一个IntegerField字段作为主键
	当表中设置了primary_key=True,就覆盖了默认添加主键的功能
(5)unique
	唯一属性(唯一索引),当字段设置unique=True就表示该字段在整张表中必须是唯一的
(6)choices
	由二元元组组成的一个可迭代对象(例:列表,元组),用来给字段提供选择选项。
	如果设置了choices,默认的表单是一个先择框而不是一个文本框,选择框中的选项就choice中的选项值
(7)db_index
	db_index=True时代表此字段设置数据库索引
(8)auto_now_add
	auto_now_add=True,在创建数据记录的时候会把当前时间添加到数据库相应字段中
(9)auto_now
	auto_now=True,每次更新数据记录时会自动更新该字段,标识该数据最后一次的修改时间
	注:只能在save方式时触发自动更新时间的动作
(10)DatetimeField、DateField、TimeField都可以使用auto_now_add和auto_now这两个属性
1.1、models中的FIeld类对应类型和对应的mysql的数据类型对比

(1)可以在pycharm中的Project项目区中的External Libraries中的Python解释器下的site-packages文件夹中的:site-packages\django\db\backends\mysql中base.py文件查看(前提是你使用的IDE是pycharm)

(2)也可以在pip安装的django包中的路径找到对应关系的文件:/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/mysql/base.py

(3)在创建的虚拟环境中的pip安装的django包中的路径找到对应关系的文件:/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/mysql/base.py

(4)下面是对应关系

'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',
1.2、字段的choices属性

(1)使用

class Book(models.Model):
		...
  	# sex = models.CharField(max_length=12)
    sex_choices = ((1, '男性'),(0, '女性'))  #enum枚举 单选
    sex = models.IntegerField(choices=sex_choices, default=1)

(2)获取含有choices属性的字典数据方法

ret = models.Book.objects.get(id=5)
print(ret.sex)  #  1 获取到的是数据库中存储的字段数据
print(ret.get_sex_display())  # 男性 -- 能够帮我们获取到该字段数据对应的choices指定的元祖中的这个数据对应的文本内容
    # sex_choices = ((1, '男性'), (0, '女性'))  # enum枚举 单选
    # sex = models.IntegerField(choices=sex_choices, default=1)
    # 比如拿sex这个字段来说,数据库中存的数据是1,表示男性,如果我想获取到男性这个字符串数据,我直接通过模型类对象.get_sex_display()这个方法就能获取到,这个方法的语法是get_模型类属性名称_display()
1.3、auto_now_add和auto_now

(1)使用

class ShowTime(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    brithday = models.DateTimeField(auto_now_add=True)  # 添加记录时,自动添加创建时间
    bday = models.DateTimeField(auto_now=True)  # 添加记录时,也能自动添加创建时间,并且更新记录时,自动更新为当前时间

(2)操作

    # models.DateTimeField(auto_now=True)中的auto_now=True对update方法没有效果
    # models.ShowTime.objects.all().update(
    #     name='chao2',
    # )

    # auto_now=True只有在使用save方法来进行更新动作时,才生效,才会自动更新修改时间
    ret = models.ShowTime.objects.get(id=1)
    ret.name = 'zhen'
    ret.save()
2、ORM的增删改查
2.1、增
  • 添加单条数据

    • 第一种添加方式

      obj = models.表(字段1=值1,字段2=值2,…)

      obj.save() # 一定要执行save否则不会执行插入数据操作

    • 第二种添加方式

      obj = models.表.objects.create(字段1=值1,字段2=值2,…)

    • 注意点:create添加完数据后会返回插入数据的类对象,通过这个类对象:对象.属性 可以获取到对应字段的数据

  • 添加多条数据

    • 通过bulk_create

      obj_list = []
      for i in range(1,10):
          obj = models.Book(
              title=f'水浒传{i}',
              state=True,
      
              pub_date=f'2018-11-{i}',
              price=11.11 + i,
              publish='出版社'
          )
          obj_list.append(obj)
      
      models.Book.objects.bulk_create(obj_list)
      
    • 也可以通过字典的方式添加多条数据,使用 **kwargs

2.2、删
  • 删除delete方法
# 调用者可以是model对象,也可以是QuerySet类型数据
    # 调用者可以是model对象,可以是querset类型数据
    # obj = models.Book.objects.get(id=3).delete()
    # print(obj) # (1, {'app01.Book': 1})

    # 返回结果其实还是受影响的行数

    # obj = models.Book.objects.filter(publish='出版社').delete()
    # print(obj)  # (2, {'app01.Book': 2})
    
    # 错误示例演示
    # obj = models.Book.objects.delete()
    # 报错'Manager' object has no attribute 'delete'
    # 控制器没有delete方法,原因就是怕你一下子全部删除了所有数据
    # 如果想删除所有数据,
2.3、改
  • 第一种:模型对象修改数据:get

    obj = models.Book.objects.get(id=1)
    # print(obj)
    obj.title = 'lol冠军之路'
    obj.price = 20
    obj.save()
    布尔值类型保存数据时,数据库中保存的是数字:1--True  0--False
    mysql中的bool使用tinyint(0)和tinyint(1)来表示的
    
  • 第二种:QuerySet对象结果集:update

    • 注:update方法,调用者可以是objects控制器,可以是queryset类型数据,但是不能是模型类对象
    (1)objects调用,下面示例是整列数据更新
    models.Book.objects.update(
        state=False,
        title='xx',
    )
    
    (2)queryset类型数据调用,下面也是更新整列数据
    models.Book.objects.all().update(
        state=True,
        # title='xx',
    )
    
    (3)queryset类型数据调用,更新部分记录数据
    # obj = models.Book.objects.filter(publish='刘伟出版社').update(
    #     # state=True,
    #     title='红楼懵',  # 别奇怪,就叫红楼懵,难道你看红楼梦,不懵吗?
    # )
    # print(obj) # 2 返回结果为受影响的行数
    
    (4)模型类对象不能直接调用update方法,错误示例如下
    models.Book.objects.get(id=1).update(
    	title='xx',
    )
    报错信息'Book' object has no attribute 'update'
    
2.4、查
  • 查询功能的13个API接口

    1. all()

      • all查询所有的数据,返回结果为QuerySet类型数据,QuerySet类似于列表,里面存放的是model类的实例化对象,是一个对象结果集,每个对象表示一条记录,对象中的对应数据有着该行记录的字段数据
      • QuerySet类似于列表,但是比列表还多一些其他的功能,这是orm给咱们封装出来的新的数据类型
    2. filter()

      • 过滤查询,结果为QuerySet类型数据,里面存放的是model类的实例化对象,是一个对象结果集,每一项也是模型类对象
      • 当查不到任何内容时,返回空的queryset
    3. get(**kwargs)

      • 过滤查询,结果有且只能有一条数据,结果不是QuerySet数据类型,是模型类对象数据,model类的实例化对象
      • 查询结果不止一个,多于一个了,就报这个错误类似,其中的部分错误数据是根据表中数据变化的
        get() returned more than one Book – it returned 9!
      • 查询不到任何数据时,也会报错,错误如下,其中的表名是根据操作的表来决定的
        Book matching query does not exist.
      • get无法和update串联操作使用
      • 示例:
        Book.objects.get(id=1)
        models.Book.objects.all().get(id=8)
    4. exclude(**kwargs)

      • 排除的情况,包含了与所给筛选条件不匹配的对象
      • orm映射中没有不等于的操作,可以通过exclude来操作,也可以使用Q查询来操作
      • exclude的返回值类型是QuerySet数据类型,调用者可以是QuerySet类型数据,或者object控制器
      • 示例:
        Book.objects.exclude(id=6),返回id不等于6的所有的对象,
        或者在queryset基础上调用,Book.objects.all().exclude(id=6)
    5. order_by(*field)

      • 对查询结果进行排序,返回值是QuerySet类型数据,调用者可以是queryset类型数据,也可以是objects控制器

      • 除了使用order_by进行查询数据后排序,还可以在models.py中进行Meta属性设置默认排序规则,不过要注意此操作会对distinct去重造成影响

        方式1:
        	order_by(*field)方法进行排序
        方式: 在模型类中通过Meta类来执行排序规则
        class Book(models.Model):
        
            id = models.AutoField(primary_key=True)  # 自增、主键
            title = models.CharField(max_length=64,null=True)
            state = models.BooleanField(default=True)
            pub_date = models.DateField(null=True)
            # price = models.DecimalField(max_digits=20,decimal_places=5,null=True)
            price = models.DecimalField(max_digits=8,decimal_places=2,null=True)
            publish = models.CharField(max_length=32)
        
            def __str__(self):
                return self.title + '价格' + str(self.price)
        
            class Meta:
                ordering = ['id',]  #制定了它之后,所有的本表的查询结果,都按照id进行升序排列,还可进行多天剑排序规则的指定
        
        reverse()翻转,必须在上面两者的基础上,才能进行结果顺序翻转
        
      • 示例:
        models.Book.objects.order_by(‘price’) # 获取所有数据,并且按照price字段升序排列
        models.Book.objects.order_by(’-price’) # 获取所有数据,并且按照price字段降序排列
        models.Book.objects.all().order_by(’-price’) # queryset类型数据调用

      • 多条排序示例:
        models.Book.objects.all().order_by(‘price’,‘id’) # 直接写price,默认是按照price升序排列,按照字段降序排列,就写个负号就行了order_by(’-price’),order_by(‘price’,‘id’)是多条件排序,按照price进行升序,price相同的数据,按照id进行升序

    6. reverse()

      • 对查询结果反向排序,可以是QuerySet类型的数据来调用,也可以是objects控制器调用
      • 示例:
        obj_list = models.Book.objects.all().order_by(‘id’).reverse()
        obj_list = models.Book.objects.reverse() # 注意:如果每给Book模型类执行Meta中的ordering属性,那么reverse()默认是不生效的。具体看官方文档的详细介绍
    7. count()

      • 返回数据库中匹配查询的(QuerySet)的对象数量,结果是个数字,可以QuerySet类型的数据来调用,也可以是objects控制器调用
      • 示例:
        obj_list = models.Book.objects.count() # 默认统计的整表的所有数据量
        obj_list = models.Book.objects.all().count()
    8. first()

      • 返回第一条记录对象,结果得到的都是model对象,不是queryset,可以QuerySet类型的数据来调用,也可以是objects控制器调用
      • 示例:
        Book.objects.all().first() #同:Book.objects.all()[0]
        Book.objects.first()
    9. last()

      • 返回最后一条记录对象,结果得到的都是model对象,不是queryset,可以QuerySet类型的数据来调用,也可以是objects控制器调用
      • 示例:
        Book.objects.all().last() #同:Book.objects.all()[-1] ,但是负数索引取值会报错,错误信息为: Negative indexing is not supported. queryset类型数据,不支持负数索引取值的形式
        Book.objects.last()
    10. exists()

      • 如果QuerySet包含数据,就返回True,否则返回False,可以QuerySet类型的数据来调用,也可以是objects控制器调用

      • 示例:
        obj_list = models.Book.objects.exists() # 判断表中是否有数据
        obj_list = models.Book.objects.filter(id=100).exists() # 判断查询结果集中是否有数据,有得到True,没有得到False

      • 还有个点需要注意一下:

        空的queryset类型数据布尔值为False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits

      • 示例:
        ‘select * from book where name=“xx”;’
        if obj_list: # 会将满足条件的所有数据进行一次查询,效率低

        ​ select count(id) from book where name=‘xx’;

        ​ if obj_list.count(): # 效率较高,按照查询结果对象的id值进行个数统计,

        ​ select id from book where name=‘xx’ limit 1; # 查询一条数据,不用扫描所有数据

        ​ if obj_list.exists(): # 效率高

        例:all_books = models.Book.objects.all().exists() # 翻译成的sql是SELECT (1) AS a FROM app01_book LIMIT 1,就是通过limit 1,取一条来看看是不是有数据

    11. values(*filed)

      • 返回一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,返回的queryset类型,里面的元素是字典数据,既然是queryset类型数据,那么就可以继续链式调用QuerySet类型的其他的查找方法,其他方法也是一样的;可以QuerySet类型的数据来调用,也可以是objects控制器调用

      • 示例:

        ​ obj_list = models.Book.objects.values() # 默认获取的表中所有记录的字典数据,字典中的键是字段名称(模型类属性名称),值是每个字段的对应数据

        # obj_list = models.Book.objects.all().values()
        # 取指定字段数据
        obj_list = models.Book.objects.all().values('id','title') 
        # <QuerySet [{'id': 5, 'title': '水浒传2'}, {'id': 6, 'title': '西游记'},...]>
        
    12. values_list(*filed)

      • 它与values()非常相似,它返回的是一个包含元组queryset序列,values返回的是一个包含字典QuerySet序列;可以QuerySet类型的数据来调用,也可以是objects控制器调用

      • 示例:

        ​ obj_list = models.Book.objects.all().values_list(‘id’,‘title’)
        ​ 结果:#<QuerySet [(5, ‘水浒传2’), (6, ‘西游记’),…]>

        ​ 不太好的一点,就是数据不知道对应的是哪个字段

    13. distinct()

      • 去重,values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复记录

      • 注意点:

        class Book(models.Model):
        
            id = models.AutoField(primary_key=True) #自增、主键
        		...
            publish = models.CharField(max_length=32)
        
            def __str__(self):
                return self.title + '价格' + str(self.price)
        		
            
            class Meta:
                ordering = ['id','publish',]
        
        
        obj_list = models.Book.objects.all().order_by('publish').values('publish').distinct()
        
        
        # 当模型类中制定了默认排序字段,那么当我们使用distinct方法进行去重时,默认会按照我们指定的排序字典进行去重,会导致去重结果不是我们想要的,所以要么我们在模型类中不指定排序字段,如果制定了排序字段,我们在使用distinct方法前面加上order_by方法,并且order_by方法中的字段就是我们要去重的字段数据
        
        官方文档中的下面这种写法
        Entry.objects.order_by('pub_date').distinct('pub_date')
        只适用于PostgreSQL数据库,mysql不支持distinct方法里面写字段
        
  • 基于双下划线的模糊查询

    Book.objects.filter(price__in=[100,200,300]) # price值等于这三个里面的任意一个的对象
    	示例:
      	ret = models.Book.objects.filter(price__in=['20.11', '1.5'])  # 针对decimal字段要用字符串
        ret = models.Book.objects.filter(price2__in=[20, 18])  # 针对float或者int类型要用数字
    
    Book.objects.filter(price__gt=100)  # 大于,大于等于是price__gte=100,别写price>100,这种参数不支持
    
    Book.objects.filter(price__lt=100)  # 小于,小于等于是price__lte=100
    
    Book.objects.filter(price__range=[100,200])  # sql的between and,大于等于100,小于等于200
    
    # 针对一些字符串数据操作:
    # 找到包含某些字符串的数据
    Book.objects.filter(title__contains="python")  # title值中包含python的
    Book.objects.filter(title__icontains="python")  # 不区分大小写
    
    # 找到以某些字符串开头或者结尾的数据
    Book.objects.filter(title__startswith="py")  # 以什么开头,istartswith  不区分大小写
    Book.objects.filter(title__istartswith='p')  
    Book.objects.filter(title__endswith="py")  # 以什么结尾,iendswith  不区分大小写
    Book.objects.filter(title__iendswith='p') 
    
    # 日期时间类型数据的操作
    # 按照年份查
    Book.objects.filter(pub_date__year=2012)
    Book.objects.filter(pub_date__year='2012')
    
    # 查某年某月的
    models.Book.objects.filter(pub_date__year=2018,pub_date__month=12)
    
    # 查某年某月某日
    models.Book.objects.filter(pub_date__year=2018,pub_date__month=11,pub_date__day=7)
    
    # 只查某月
    models.Book.objects.filter(pub_date__month=7)
    
    # 查询某个字段为空的数据
    models.Book.objects.filter(title__isnull=True) #正规的
    models.Book.objects.filter(title=None)  
    
    # 原生sql语句:
    # SELECT `app01_book`.`id`, `app01_book`.`title`, `app01_book`.`state`, `app01_book`.`pub_date`, `app01_book`.`price`, `app01_book`.`price2`, `app01_book`.`publish`, `app01_book`.`sex` FROM `app01_book` WHERE `app01_book`.`title` IS NULL ORDER BY `app01_book`.`id` ASC, `app01_book`.`publish` ASC
    

    查看某个orm语句的原生sql语句方法

    print(models.Book.objects.filter(title__isnull=True).query)
    
2.5、动态操作
  • 更新或添加:Update_or_create()

    • 有就更新,没有就添加update_or_create()

      # 有就更新的操作示例:
      models.Book.objects.update_or_create(
          id=6,
          defaults={
              'title':'西游记',
              'state':True,
              'pub_date':'2018-11-11',
              'price':1.5,
              'publish':'武大郎出版社'
          }
      )
      
      # 没有就创建(添加)的示例:
      models.Book.objects.update_or_create(
          id=100,
          defaults={
              'title': '红楼梦',
              'state': True,
              'pub_date': '2018-11-11',
              'price': 1.5,
              'publish': '武大郎出版社'
          }
      )
      
      # 查询为多条记录的演示示例:报错,因为update_or_create内部进行查询时,使用的是get方法查询
      models.Book.objects.update_or_create(
      	publish='武大郎出版社',
          defaults={
              'title': '红楼梦2',
              'state': True,
              'pub_date': '2018-11-11',
              'price': 1.5,
              'publish': '武大郎出版社'
          }
      )
      
  • 查询或添加:get_or_create()

    • 查询或创建,能够查询到就返回查询结果,查询不到就添加记录,查询时内部使用的还是get方法

      # 查询到结果的示例:
      ret = models.Book.objects.get_or_create(
          id=100,
          defaults={
              'title': '西游记',
              'state': True,
              'pub_date': '2018-11-11',
              'price': 1.5,
              'publish': '武大郎出版社'
          }
      )
      print(ret)  # (<Book: 红楼梦>, False)  # 如果没创建,那么返回结果元组中的第二个元素为Flase
      
      # 查询不到,自动添加记录的示例
      ret = models.Book.objects.get_or_create(
          id=102,
          defaults={
              'title': '西游记',
              'state': True,
              'pub_date': '2018-11-11',
              'price': 1.5,
              'publish': '武大郎出版社'
          }
      )
      print(ret)  # (<Book: 西游记>, True)  # 如果创建了新纪录,那么返回结果元祖中的第二个元素为True
      
2.6、关键字传参的两种方式:
方式1
filter(id=5, publish='出版社')
create(id=5, publish='出版社')
...

方式2
filter(**{'id':5, 'publish':'出版社'})
...

七、数据库的连接

这里只讲解两种数据库的连接模式:

  • Django自带的sqlite3小型数据库,实际应用不常用,多用于测试代码时使用

  • mysql数据库的连接操作

(1)sqlite3

​ Django默认自带的数据库,直接执行初始化创建数据库即可

(2)mysql

​ mysql数据库的连接需要配通过包来实现,在Java中叫连接池,不过python把这个封装成了包,很多包都可以实现,对于django1.0版本通常使用pymysql模块来实现连接,但是对于django2.0版本以上可能会出错,这时也可以使用mysqlclient模块来连接数据库,当然还有一些其它连接数据库的模块。

​ 这里主要介绍pymysql的连接方法

  • 下载好pymysql模块后

  • 在项目主目录的__init__.py中指定

    	import pymysql
    	pymysql.install_as_MySQLdb()
    
  • settings文件中的DATABASES里面配置数据库的连接信息

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 数据库类型
            'NAME': 'drawer',					   # 数据库名
            'USER': 'root',						   # 用户名
            'PASSWORD': '1234',					   # 密码
            'HOST': 'localhost',				   # ip
            'PORT': '3306',						   # 端口
            'OPTIONS': {
                "init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
            }  # 这个可以不写
        }
    }
    
  • 注意:连接mysql数据库的时候要现在mysql中创建好数据库,不然连接时会报错,因为djang无法自动创建数据库

(3)初始化和执行数据库

​ 初始化命令:python manage.py makemigrations

​ 执行操作命令:python manage.py migrate

(4)通过pycharm的图形界面操作来操作数据库

​ 在pycharm的右边框位置有个database在里面可以创建sqlite和MySQL的连接实现对数据库的操作

(5)还有一些关于数据库操作中的问题,后面会总结,关注本人博客即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值