Django---一个项目的创建(2)

1.配置数据库

DATABASES 配置:用于进行数据库连接信息的配置:
ENGINE:用于特定的数据库引擎的配置,一般选项如下:

'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'

NAME:要连接的数据库名称的配置
USER:配置连接数据库的用户账号
PASSWORD:配置连接数据库的登录密码
HOST:配置数据库所在的主机 IP 地址
PORT:配置连接数据库的端口号
CHARSET:配置连接数据库交互数据编码格

如果使用Django自带的数据库则不需要更改配置,我们使用的是mysql数据库,所以更改配置如下:

# 导入数据库
import pymysql
pymysql.install_as_MySQLdb()
"""
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
"""
#改为
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'books01b',
        'HOST':'127.0.0.1',
        'PORT':'3306',
        'USER':'root',
        'PASSWORD':'159357'

    }
}

2.定义模型类

打开 models.py 文件,定义模型类
引入包 from django.db import models
模型类继承自 models.Model 类

# 自定义类
class User(models.Model):
    # 自增主键
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    age = models.ImageField(default=18)
    # null=True, blank=True 允许为空
    nickname = models.CharField(max_length=255, null=True, blank=True)
    birthday = models.DateTimeField(default=datetime.now())

3.同步数据

根据模型类自动生成对应数据库引擎的sql 语句

在 settings.py 中,连接数据库信息中配置了数据库引擎,其实就是已经告诉 Django 我们使用的是哪个数据库了,Django会根据指定的数据库自动生成对应sql 语句。执行如下的命令:

python manage.py makemigrations
查看生成的sql语句

通过命令自动生成 sql 语句之后是存储在文件中的,我们可以通过命令的方式直接查看生成的 sql 语句:

# 执行命令,查看生成的 sql 语句
python manage.py sqlmigrate [app_name] [no]
自动同步到数据库

既然 Django 可以自动生成 sql 语句,当然可以自动同步到数据库中,并不需要开发人员再去手工创建各种数据表了:

python manage.py migrate

此时,再查看你的数据库,如果上面的命令都没有报错,则会发现我们定义的模型对应的表已经创建出来了。

注意问题

1、 python3 无法正常使用 mysql 的解决办法
django 连接 mysql 默认驱动是 MySQLdb, MySQLdb 没有支持 python3 的版本.在 django 项目配置文件同目录下的init.py 文件中加入以下代码:

import pymysql
pymysql.install_as_MySQLdb()

2、 python3 外键定义报错

hBook = models.ForeignKey('BookInfo')
Django2.0 下运行会提示这样的错误:
typeError: __init__() missing 1 required positional argument:'on_delete'

解决办法:

hBook = models.ForeignKey('BookInfo',on_delete=models.CASCADE)

3、生成迁移文件报错

django.db.utils.InternalError:(1049,"Unknown database 'books'")

手工创建数据库 books

4.数据测试

方便起见,可在modle中重写str

def __str__(self):
        return "当前用户的姓名{},昵称{},年龄{},邮箱{}", format(self.name, self.nickname, self.age, self.email)

查询数据的操作一般都是数据操作中比较复杂的一部分,针对不同的操作方式进行分类讲解,为了方便进行快速的操作,我们通过Django提供的一个shell测试命令行进行处理

1.进入项目主目录文件夹,运行如下命令进入项目测试命令行:
python manage.py shell
2.增加数据
>>>u1=models.User(name="woaini",nickname="mumu",age ="18",email = "@180")
>>> u1.save()
3.删除数据
u1.delete()
4.查询多条数据
4.1 all() 查询所有数据
>>> from zhuce.models import User

>>> User.objects.all()

<QuerySet [<User: 当前用户的姓名zhaoyu,昵称123,年龄11,邮箱@>, <User: 当前用户的姓名xuzhengl,昵称dada,年龄18,邮箱@150>]>
4.2 filter[条件]根据条件查询数据【具体见下】
>>> u2 = u1.filter(id=1)

>>> u2

<QuerySet [<User: 当前用户的姓名zhaoyu,昵称123,年龄11,邮箱@>]>
4.3 exclude[条件]查询该条件以外的数据
>>> u2 = u1.exclude(id=1)

>>> u2

<QuerySet [<User: 当前用户的姓名xuzhengl,昵称dada,年龄18,邮箱@150>]>
4.4order_by[”条件“]按照条件顺序或逆序排列
>>> u1.order_by("id")

<QuerySet [<User: 当前用户的姓名zhaoyu,昵称123,年龄11,邮箱@>, <User: 当前用户的姓名xuzhengl,昵称dada,年龄18,邮箱@150>]>

>>> u1.order_by("-id")
<QuerySet [<User: 当前用户的姓名xuzhengl,昵称dada,年龄18,邮箱@150>, <User: 当前用户的姓名zhaoyu,昵称123,年龄11,邮箱@>]>
4.5 values()将数据以字典的形式存在列表中
>>> u2 = u1.values()
>>> u2
<QuerySet [{'id': 1, 'name': 'zhaoyu', 'nickname': '123', 'age': '11', 'email': '@', 'address': None, 'tel': ''}, {'id': 2, 'name': 'xuzhengl', 'nickname': 'dada', 'age': '18', 'email': '@150', 'address': None, 'tel': ''}]>
注意:

注意get方法和filter方法的区别,主要有两点区别:
1、 get获取的是一个对象,而filter获取的是一个列表
2、 get如果获取不到值(没有条件符合),则报错,而filter会返回一个空列表

5.查询1条数据
5.1get(条件)查询1条符合条件的数据,注意:0条或多条均报错
>>> u1.get(id=1)
<User: 当前用户的姓名zhaoyu,昵称123,年龄11,邮箱@>
5.2count()返回查询到的所有数据的个数或符合条件的个数
>>> u1.count()
2
>>> u1.filter(id=1).count()
1
5.3 frist()last()查询第一个和最后一个
>>> u1.first()
<User: 当前用户的姓名zhaoyu,昵称123,年龄11,邮箱@>
>>> u1.last()
<User: 当前用户的姓名xuzhengl,昵称dada,年龄18,邮箱@150>
5.4exists() 查询符合条件的数据是否存在
>>> u1.filter(id=1).exists()
True[存在]
>>> u1.filter(id=4).exists()
False[不存在]
6.条件查询filter(。。。)
6.1相等条件查询 key=value
6.2包含条件查询 key__contains=value:模糊查询like
6.3开头结尾查询 key__startswith=value key__endswith=value
6.4是否为空查询 key__isnull=True key__isnotnull=True
6.5范围查询 key__in=[1,2,3,4,5,6,7]
6.6关系查询

key__gt=1 大于1 grant than

key__gte=1 大于等于1grant than or equals

key__lt=1 小于1

key__lte=1小于等于1

6.7日期查询`[year/month/day/week_day/hour/minute/second]

n key__year=2017`

7.多条件查询
from django.db.models import Q
引入Q
7.1 或者
>>> u1.filter(Q(name = "zhaoyu")|Q(name = "xuzhengl"))
<QuerySet [<User: 当前用户的姓名zhaoyu,昵称123,年龄11,邮箱@>, <User: 当前用户的姓名xuzhengl,昵称dada,年龄18,邮箱@150>]>
7.2 并且
>>> u1.filter(Q(name = "zhaoyu")&Q(age = "11"))
<QuerySet [<User: 当前用户的姓名zhaoyu,昵称123,年龄11,邮箱@>]>
7.3 取反
>>> u1.filter(~Q(age = "11"))
<QuerySet [<User: 当前用户的姓名xuzhengl,昵称dada,年龄18,邮 箱@150>, <User: 当前用户的姓名woaini,昵称mumu,年龄18,邮箱@180>]>
8.数值加1

引入F

from django.db.models import F
>>>User.objects.filter(id=1).update(age=F("age")+1)
1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容