django文件迁移关联数据库,以及模型创建

迁移文件与模型实现

python manage.py makemigrations

python manage.py migrate  #迁移

指定数据库迁移

python manage.py migrate userinfo --database==newdb1
#python manage.py migrate 迁移的文件 --database==指定数据库名字

新的数据库也可以在setting文件中设置,接上下面的第5点

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'newproject',
        'USER': 'root',
        'PASSWORD': 'mysql',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    },
    'newdb1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'autotest',
        'USER': 'root',
        'PASSWORD': 'mysql',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

更改后台管理站点

LANGUAGE_CODE = 'zh-Hans'
# LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Shanghai'
# TIME_ZONE = 'UTC'

设置项目的关系型数据库

在settings文件下

DATABASES = {
    #'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'newproject', #数据库的名字
        'USER': 'root',#数据库用户名
        'PASSWORD': 'mysql',
        'HOST': '127.0.0.1',
        'PORT': 3306, #数据库端口
    }
}

这里选的是mysql关系型数据库
附上数据库引擎选择的官方文档地址:

https://docs.djangoproject.com/en/1.11/ref/settings/#engine

在项目同名文件夹下添加驱动文件

在__init__.py文件下

import pymysql
pymysql.install_as_MySQLdb()

在指定的数据库中创建数据库

打开系统终端,输入mysql,输入用户和密码,进入数据库

mysql -uroot -p

创建数据库,需要与setting文件中的数据库的名字相同

create  database 数据库名 charset=utf8; #设置字符串编码方式

6、模型创建

在每一个应用的models.py文件中创建模型

注意点

1、创建的模型需要继承与models.Model

2、创建的模型的字段的数据类型需要和数据库的数据类型一一对应

3、id默认是主键并且是自增的,默认的
4、CharField必须设置max_lenth=

字段类型

数据类型说明
AutoField自动增长的integerField,一般情况下不需要指定的,Django自动创建的
IntegerField整数
Small IntegerField小整数
CharField字符串,需要指定max_lenth
foreign key外键
datetimefield年月日,时分秒
datefield年月日,yyyy-mm-dd。1.auto_now 表示每次保存当前对象的时候,自动设置该字段的时间为当前时间,用于‘最后一次修改’的时间戳。2.auto_now_add 表示的是当对象第一次被创建的时候,自动设置当前的时间。3.auto_now和auto_now_add是相互排斥的。
decimalfield十进制浮点数,max_digits表示的是总的位数 decimal_places表示的是小数的位置
注意点:

1.auto_now  表示每次保存当前对象的时候,自动设置该字段的时间为当前时间,用于‘最后一次修改’的时间戳。
2.auto_now_add 表示的是当对象第一次被创建的时候,自动设置当前的时间。3.auto_now和auto_now_add是相互排斥的。

字段约束

max_lenth最大字符个数
primary_key主键
null如果是true,说明这个字段是允许为空的,默认值是False,为空(数据库层面)
blank如果是true,说明这个字段是允许为空的(表单验证)
unique这个字段在表中的数据必须是唯一值
db_index在表中为当前的字段设置索引
default默认值
db_column字段名称,如果没有指定则使用属性值

模型查询

filter(过滤器)

模型类.objects.filter(查询条件)
注意点:
1、filter返回的是一个列表

get

注意点:

1、get返回的数据必须有且仅有一个。如果返回的结果没有匹配到数据或者返回多个,则报错。

exclude(不包括、排除)

注意点:

1、exclude这个方法返回的是正好与查询规则相反的数据。(取反)

条件运算符

1、exact  表示相等,作用等同于id

2、endswith 表示的是以。。。结尾

3、iendswith  i表示忽略大小写,以。。。结尾

4、contains   包含

5、is null   空值查询

6、regex    正则

F对象、Q对象

F对象是用来对比两个字段的,不是跟一个具体的常量来进行对比

Q对象表示的是多个筛选条件,表示的是各个条件的逻辑 与、或、非 关系

条件查找(页面显示)

from django.shortcuts import render
from django.http import HttpResponse,JsonResponse
from django.db.models import Q,F
import pymysql
from .models import Book,RoleInfo

#需要增加的导包
from django.db.models import Q,F


def test(request):
    # 寻找id>2的书籍
    books=Book.objects.filter(id__gte=2)
    #找出2020年出版的书籍
    books=Book.objects.filter(pubtime__year=2020)
    #找出id>2 并且2020年出版的书籍
    books = Book.objects.filter(id__gte=2,pubtime__year=2020)
    #id小于2,或者以西开头的。 与& 或| 非~
    books = Book.objects.filter(Q(id__lt=2)| Q(bookname__istartswith='西'))
    print(books)
    return HttpResponse('ok')

查询集的两大特性

1.懒执行

创建查询集的时候不会访问数据库,直到调用数据的时候,才会去访问数据库,

调用数据:迭代,序列化(python转json),if

2.缓存

使用同一个查询集的时候,第一次使用时会发生数据库的查询,然后将结果缓存下来,再次使用同一个查询集的时候会使用缓存数据。

模型类关系

一对多关系

from django.db import models

# Create your models here.
class Book(models.Model):
    '''当前模型定义的是一个书籍表'''
    bookname=models.CharField(max_length=20,verbose_name='书籍名字')

    #出版日期
    pubtime=models.DateField(default='2000-10-10')

    #逻辑删除
    isdeleted=models.BooleanField(default=False,db_column='isdeleted')

    #销售量
    seltnum= models.IntegerField(verbose_name='销售量')

    #存储量
    count = models.IntegerField(verbose_name='存储量')

    #退货量
    cancelnum= models.IntegerField(verbose_name='退货量')



class RoleInfo(models.Model):
    rolename=models.CharField(max_length=20,verbose_name='角色名字')
    gender=models.SmallIntegerField(verbose_name='性别')
    #外键关系,一对多关系,关系外键写在从表上
    book=models.ForeignKey(Book)

    def __str__(self):
        return self.rolename
        
注意点:


多对多关系,将字段定义在任何一端中

class Info(models.Model):
	'''这是一个新闻类型类'''
    classname = models.CharField(verbose_name='新闻类型',max_lenth=50)
class NewInfo(models.Model):
    title = models.CharField(verbose_name='新闻大标题',max_lenth=50)
    detail = models.TextField()
    author = models.CharField(verbose_name='作者',max_lenth=50)
    pubtime = models.DataField(auto_now_add=True)
    classtype = models.ManyToManyField('Info')       #开头被赋值的变量名中不能出现下划线,会和有两个下划线的方法冲突
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南桥经不起秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值