Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中
背景:
之前也读过一些关于django的一些书,看过别人写的一些博客系统。但是总有一种看别人的都会,但自己写不出来的感觉,于是为了加深对django的学习就开始动手学习了。
环境搭建:
环境:使用python2.7(x64)+django1.11.5+mysql5.7.17 win7x64环境下,ide使用pycharm(个人破解版本)
1)新建一个myblog的django项目,同时定一个blog的app,新建成功后,修改myblog工程下settings.py配置(把数据库从默认的sqlite切换到mysql下):
""" 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), """ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2','mysql', 'sqlite3' or 'oracle' 'NAME': 'my_django_blog', # Your db name, Or path to database file if using sqlite3 'USER': 'root', # Your db user name, Not used with sqlite3 'PASSWORD': '123456', # Your db password, Not used with sqlite3 'HOST': '', # Your db host, set to empty string('') for default for localhost, Not used with sqlite3 'PORT': '3306', # Your db port, set to empty string('') for default, Not used with sqlite3 } }
注意:
上边的注视掉的默认配置最好不要包含到DATABASES={}配置项内部,可能会导致错误。
2)mysql安装就跳过,但是需要安装mysql的python驱动:
可以选择三中安装方式:
1) pip install MySQL-python (注意大小写要一致)
2)在 https://pypi.python.org/pypi/MySQL-python/ 下下载MySQL-python的压缩包 解压到本地MySQL-python-1.2.5,进入到MySQL-python-1.2.5 下,输入:
python setup.py install
3)下载MySQL_python-*.whl安装包,在下载之前先要确定你安装的Python是32位的还是64位的,如果是32位的就下载32位的,如果是64位的就下载64位的。在这里下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/
下载后进入下载文件所在的目录:shift键+鼠标右键-》在“打开的菜单中”找到“在此处打开命令窗口(W)”点击进入cmd窗口,运行:pip install *.whl
备注:
前两种方法我再win7环境下安装python的mysql驱动都失败了(失败信息:building '_mysql' extension error: INCLUDE environment variable is empty),建议使用第三种。
创建post/category/tag实体,并同步到数据中
关于在django项目中如何使用实体,请参考文章:https://docs.djangoproject.com/en/1.10/topics/db/models/
1)在blog的app下的models.py文件内创建实体:post/category/tag
1 # -*- coding: utf-8 -*- 2 from __future__ import unicode_literals 3 from django.db import models 4 from django.contrib.auth.admin import User 5 6 7 # ''' 8 # 文章栏目(分类)实体 9 # ''' 10 class Category(models.Model): 11 name = models.CharField(max_length=128) # 文章栏目(分类)名称 12 13 def __str__(self): 14 return self.name 15 16 17 # ''' 18 # 文章标签实体 19 # ''' 20 class Tag(models.Model): 21 name = models.CharField(max_length=128) # 文章标签名称 22 23 def __str__(self): 24 return self 25 26 27 # """ 28 # 文章实体 29 # """ 30 class Post(models.Model): 31 title = models.CharField(max_length=128) # 文章标题,定义最大长度为128 32 """ 33 如果不使用blank=True标识,则当该值为空时会保存操作会抛出异常 34 """ 35 summary = models.CharField(max_length=256, blank=True) # 文章简介,定义最大长度为1256。 36 body = models.TextField() # 文章内容,较长因此定义为TextField 37 create_time = models.DateTimeField() # 文章创建时间 38 modify_time = models.DateTimeField() # 文章修改时间 39 views = models.PositiveIntegerField(default=0) # 文章阅读数量,默认为0 40 ''' 41 一篇文章只能归属一个栏目,而一个栏目下可能会拥有多篇文章,因此这是一对多的关联关系。 42 关于用法请阅读:https://docs.djangoproject.com/en/1.10/topics/db/models/#relationships 43 ''' 44 category = models.ForeignKey(Category) # 文章分类 45 ''' 46 一篇文章允许有多个标签,一个标签允许被多篇文章使用,因此他们的关系是多对多关系,但是同时该值可以不设置,因此使用black=True标识该字段允许为空。 47 ''' 48 tags = models.ManyToManyField(Tag, blank=True) # 文章标签 49 ''' 50 # 由于django.contrib.auth 是 Django 内置的应用,它用于处理网站用户的注册、登录等流程,User 是 Django 为我们已经写好的用户模型。 51 #一篇文章对应一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。 52 ''' 53 author = models.ForeignKey(User) # 文章作者 54 55 def __str__(self): 56 return self.title
2)在“manage.py@myblog”窗口中执行数据同步
执行数据同步的目的是为了新建数据库及定义的实体类对应的数据表的同步。
问题:当执行makemigrations时,提示数据库不存在(django.db.utils.OperationalError: (1049, "Unknown database 'my_django_blog'")),于是手动在mysql数据库中创建了my_django_blog数据库。
之后在执行makemigrations、migrate、createsuperuser一切都正常。
C:\Users\Administrator>mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.17 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | blogs | | hibernate_01 | | hibernate_09 | | j2cms-ssh | | my_blog | | my_ssh | | mybatis | | mysql | | performance_schema | | sys | +--------------------+ 11 rows in set (0.00 sec) mysql> create datebase my_django_blog; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'datebase my_django_blog' at line 1 mysql> create database my_django_blog; Query OK, 1 row affected (0.01 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> use my_django_blog; Database changed mysql> show tables; +----------------------------+ | Tables_in_my_django_blog | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | blog_category | | blog_post | | blog_post_tags | | blog_tag | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+ 14 rows in set (0.00 sec) mysql>
基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
【+加关注】。