Django之模型(一)

  • 检查mysql并创建库
  1. mysql是否正常运行,一般使用工具或命令行连接一次
    命令: test@test:~$ mysql -u root -p1q2w3e4r

    输入命令后,以下画面则表示mysql正常:
    image.png
  2. 创建库
 mysql> create database test_db;

或者用工具创建 ,数据工具创建的话,默认编码需要填写utf8

  • 数据库连接配置,修改settings.py中配置


    image.png

    改为连接mysql配置:
    image.png
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 你的数据库引擎
        'HOST': "localhost", # 你的数据地址,localhost代表本地
        # 端口,数据库的默认端口一般是3306,如果就算采用虚拟机NAT方式,此端口是指虚拟机上mysql端口,
        # 因为连接数据库前用ssh连接了,后面操作就相当于在虚拟机环境本地连接
        "PORT": 3306,
        "USER": "root",  # 用户名
        "PASSWORD": "qwe123", # 密码
        "NAME": "test_db"  # 库名
    }
}
  • 运行项目
    image.png

    数据库连接报错,缺少组件,可以安装以下的包
    安装依赖(如果使用虚拟环境,需要在虚拟环境下安装)
    安装mysql开发依赖包
    sudo apt-get install libmysqlclient-dev gcc
    配置mysql_config(如果使用虚拟环境,需要在虚拟环境下安装)
    sudo updatedb
    locate mysql_config
    pip install MySQL-python(这个要切换到对应python环境中去执行)
    ps: 按着执行就可以

注意:

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

Django 在连接 MySQL 数据库时默认使用的是 MySQLdb 驱动, 然而我们没有安装该
驱动, 因为它并不支持 Python3, 我们现在安装的是 PyMySQL 驱动
pip install PyMySQL(py3虚拟环境中)
如何让当前的 Django 通过 PyMySQL 来
连接 MySQL 数据库呢? 方法很简单。
在.../项目/__init__.py 目录下添加:
import pymysql
pymysql.install_as_MySQLdb()

如果出现连接被拒绝的错误:
1.查看你的配置是否填写错误;
2.检查你的用户是否有远程权限;
基于安全考虑root账户一般只能本地访问,但是在开发过程中可能需要打开root的远程访问权限。下面是基本的步骤:
1、登录到mysql中,为root进行远程访问的授权,执行下面的命令:
mysql> GRANT ALL PRIVILEGES ON . TO root@"%" IDENTIFIED BY "passwd";
mysql> flush privileges;
第一句中"%"表示任何主机都可以远程登录到该服务器上访问。如果要限制只有某台机器可以访问,将其换成相应的IP即可,如:
GRANT ALL PRIVILEGES ON . TO root@"192.168.2.135" IDENTIFIED BY "passwd";
第二句表示从mysql数据库的grant表中重新加载权限数据。因为MySQL把权限都放在了cache中,所以在做完更改后需要重新加载。

默认mysql的用户是没有远程访问的权限的,因此当程序跟数据库不在同一台服务器上时,我们需要开启mysql的远程访问权限。

  • 编写对应的model
  1. 在每个app中都有对应的models.py文件,我们可以在里面定义你需要的models
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Article(models.Model): #类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name)
    #属性=models.字段类型(选项)
    # 如果没有添加主键,django会默认添加一个ID的主键
    title = models.CharField(u'标题',max_length = 20, null = False) #第一参数为备注
    content = models.CharField(u'内容',max_length=150, null = False)
    comment = models.CharField(u'评论',max_length = 50)
    reply = models.CharField(u'回复',max_length=50)
    status = models.IntegerField(u'状态',default = 1)
  • 生成对应的migrations文件
 python manage.py makemigration
image.png

生成对应文件:
image.png

可能pycharm没有这个py文件,需要从远程服务器download下来。
使用makemigrations 命令需要事项
1、一但将生成的migrations文件通过migrate命令同步至数据库以后,被操作的migrations文件不能再操作
2、如何避免上面的情况:
(1)不要对已经生成好的migrations文件做任何操作
(2)所有对数据库的操作同一个人做,并保留好一套migrations文件
(3)不要直接在数据库中修改任何操作,比如修改字段,添加字段,删除
ps: 一套对应生成的migrations文件与数据库需保存一致,否则系统会报错!!!
ps: 需要对数据库表的操作都需要models.py,然后走对应的migrate流程,不能直接在数据库中修改数据字段等等;
如果我之前通过model创建过表之类的,也有数据,后期因业务需要对现存表进行字段扩充或者条件约束,如果对原有model修改,那么原有的migrations文件不能变动,只需要重新 python manage.py makemigration,它会与之前文件比较生成另外的文件的,然后migrate命令同步到数据库,不影响历史数据的。

  • 迁移同步,同步到数据库
 python manage.py migrate
image.png

image.png

image.png
  • 新增数据
    前面已经建立了表结构,现在需要为其添加数据
#views.py
from .models import Article
class AddArticle(View):
    def get(self,request):
        # article = Article()
        # article.title = '2使用django新增一条数据'
        # article.content = '2可以使用django的save方法持久化一条数据'
        # article.comment = '2文章总结的到位,点赞'
        # article.reply = '2谢谢,互相学习'

        # 以下为新增数据简写的方式
        article = Article(title="3使用django新增一条数据",content = '3可以使用django的save方法持久化一条数据',
                comment = '3文章总结的到位,点赞',reply = '3谢谢,互相学习')
        article.save() #使用save方法保存

        article = Article..objects.create(title="3使用django新增一条数据",content = '3可以使用django的save方法持久化一条数据') #create方式新增数据

        return render(request,'addArticle.html',locals()) 

#如果要在前台展示插入的值,可以写个模板页面addArticle.html
#注意如果存在外键之类的,要么对象.数据库表中对应的字段,要么对象.属性.外键
<p>标题:{{article.title}}</p>
<p>内容:{{article.content}}</p>
<p>评论:{{article.comment}}</p>
<p>回复:{{article.reply}}</p>
</body>
#urls.py
url(r'^addarticle/$', views.AddArticle.as_view())

插入数据库中的值
image.png

页面效果:
image.png

注意:
用一句话方便的创建并保存一个对象。

objects.create 直接创建并保存了对象,这样 user 代表的就是一个已经保存在数据库中的实例,如果需要一步完成对象的创建与存储至数据库,则使用objects.create()方法;
而方法二的 user 则是一个没有保存在数据库中的实例,如果涉及到 user 是某个对象的外键则需要把它真正存进数据库后才能设置为相应的外键,如果用方法一的方式创建则不用担心这个问题,直接设置就可以了。
二者最后达到的目的是一样的,区别就在于如果在创建对象时所需的数据都知道那么可以直接用 create,反之则需要 save。 当然一直用 save 也没有任何问题。

  • 查询
#views.py
class DisplayArticle(View):
    def get(self,request):
        # 查询单个数据
        # 通过get方式返回的数据,它只会返回一个对象
        #如果通过条件返回的数据有多条或者找不到,都会报错
        # article = Article.objects.get(pk=1) #在django 的ORM查询中,数据库的主键可以用PK代替, 官方推荐使用pk
        # article = Article.objects.get(id=1)#等同于select * from hello_article where id=1;
        #使用all()方法获取所有
        articleAll = Article.objects.all()
        return render(request,'displayArticle.html',locals())
#displayArticle.html模板页面
<body>
{#单个查询结果: <br/>#}
{#<p>标题:{{article.title}}</p>#}
{#<p>内容:{{article.content}}</p>#}
{#<p>评论:{{article.comment}}</p>#}
{#<p>回复:{{article.reply}}</p>#}
Article.object.all()的查询结果: <br/>
{% for article in articleAll %}
<p>标题:{{article.title}}</p>
<p>内容:{{article.content}}</p>
<p>评论:{{article.comment}}</p>
<p>回复:{{article.reply}}</p>
{% endfor %}
</body>
#urls.py
url(r'^displayArticle/$', views.DisplayArticle.as_view())
image.png
  • 删除
class DelArticle(View):
    def get(self,request):
        # 批量删除
        # 等同于 DELETE FROM hello_article WHERE status=0
        # 批量删除,如果找不到数据,就不会删除
        # Article.objects.filter(status = 0).delete()

        # 删除单个
        # DELETE FROM hello_article WHERE id=9
        # 如果数据不存在,则会报错
        Article.objects.get(id=9).delete()

        #删除之后在查询
        articleAll = Article.objects.all()

        return render(request,'displayArticle.html',locals())

  • 修改
class UpdateArticle(View):
    def get(self,request):
        # 批量修改
        # UPDATE hello_article SET status=3 WHERE status=2
        # Article.objects.filter(status=2).update(status=3)

        # 单个修改
        # 实际上save方法如果当前实例已经存在于数据库中,它就会当作一个update操作
        # Article.objects.filter(id=7).update(status=4)
        article = Article.objects.get(pk=8) #取出pk=7的对象,然后修改其状态,再保存
        article.status = 0
        article.save()

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

推荐阅读更多精彩内容