在开始本片博客之前,请确保您已经安装mysql和python-mysql
配置数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test', #选择连接的数据库,根据自己的数据库进行填写
'USER':'root', #填写用户名
'PASSWORD':'123456', #填写数据库的密码
'Host':'127.0.0.1',
'Port':'',
}
}
默认是sqlite的,如果要使用mysql的要将配置改为mysql的配置
配置完成后,我们开始创建我们的应用:
python manage.py startapp blog
进入到创建的项目blog中:cd blog
找到文件models.py进行编辑添加模块
class Passage(models.Model):
name= models.CharField(max_length=30)
author = models.CharField(max_length=20)
pubtime = models.CharField(max_length=12)
website = models.URLField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=10)
emal = models.CharField(max_length=30)
city = models.CharField(max_length=10)
def __str__(self):
return self.name
文章有属性:文章名,作者,发布时间,网址
作者有属性:姓名,邮件,城市
__str__(self):是为了在python-shell中更好的查看,当然,还有其他的作用就不再这里说了,这个函数很方便的,提倡使用
然后,我们找到settings.py文件,把我们的‘blog’模块加入进去
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
接着,我们便开始将模型的数据添加到mysql中了
添加之前,先验证下模型:
python manage.py check --验证模型
确认有效后,运行以下命令,告诉Django你对模型做了修改(这里是新建了模型)
python manage.py makemigrations blog
你应该会看到下面的输出:
Migrations for 'blog':
0001_initial.py:
- Create model Author
- Create model Passage
Django把模型(数据库模式)的改动自动存储在迁移中。迁移就是磁盘中的文件。运行上述命令后,blog应用的migretions文件夹里会出现一个0001_initial.py的文件。
sqlmigrate命令的参数是迁移的名称,输出结果是相应的SQL:
python manage.py sqlmigrete blog 0001
运行后可以看见他对数据库进行的操作:
BEGIN;
CREATE TABLE `blog_author` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(10) NOT NULL, `emal` varchar(30) NOT NULL, `city` varchar(10) NOT NULL);
CREATE TABLE `blog_passage` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(30) NOT NULL, `author` varchar(20) NOT NULL, `pubtime` varchar(12) NOT NULL, `website` varchar(200) NOT NULL);
COMMIT;
Django会为各个表添加主键。即id字段
sqlmigrate并不会创建表, 其实他根本不接触数据库,只是在屏幕上输出Django即将执行的SQL。如果愿意可以将中间的SQL语句复制到数据库客户端里执行。然而,Django为提交SQL提供了更加简单的方式:
python manage.py migrate
运行这个命令后会看到以下信息:
Operations to perform:
Synchronize unmigrated apps: staticfiles, messages
Apply all migrations: admin, blog, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying blog.0001_initial... OK
Applying sessions.0001_initial... OK
可以从进入数据库看到:Django创建的数据表
当你对models.py文件做了修改后,应该将数据更新到数据库:
python manage.py makemigrations
python manage.py migrate
python-shell的使用:
python manage.py shell
导入模块:
Python 2.7.15 |Anaconda, Inc.| (default, Dec 10 2018, 21:57:18) [MSC v.1500 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.
IPython 5.8.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: from blog.models import Author
查看其中的数据(为了显示,已经添加了两个元组):
In [2]: Author.objects.all()
Out[2]: [<Author: 代国平>, <Author: 肖尧>]
一般来说,显示的是
Out[2]: [<Author: object>, <Author: object>]
回想一下,我之前的models.py文件中是不是写了一个函数__str__(self),目的就是为了提供便利,当然也不仅仅是这个作用。
插入和更新数据:
newdata=Author(id='3',name="杨培杰",“2376020104@qq.com”,"许昌")
newdate.save()
在数据库中就能 看到新插入的数据元组了
过滤数据
因为all()是一次性从数据库中找出所有的数据,然而我们在实际的使用中是有选择的查找数据,处理他的子集。在DjangoAPI中,可以使用filter()方法来过滤数据:
Author.objects.filter(name="代国平")
`其他查找类型:
Author.objects.filter(name__contains='代')
[<Author:代国平>]
支持的其他查找类型还有icontains(不区分大小写的LIKE),startwith,endwith,range(SQL的between语句)。这里不做详细介绍。
`检索单个对象
filter()返回的是一个查询集合(列表),有时候,需要获取单个对象,此时应该使用get()方法:
Author.objects.get(id=1)
<Author: 代国平 > #查找单个对象
-----------------------------------------------------------------------------------------
Author.objects.get(city="成都") #得到多个对象会引发错误
Traceback(most recent call last):
...
MultipleObjectReturned:get() return more than one Author --it return 2!Lookup paraments were {'city':'成都'}
-----------------------------------------------------------------------------------------
Author.objects.get(name='不存在的人') #查询不存在的对象也将导致异常
Traceback (most recent call last):
...
DoesNotExist: Author mathing query does not exist.
·排序数据
Author.objects.order_by("id") #可以根据任何字段进行排序,也可以多个参数order_by("id","name")
[<Author:代国平>,<Author:肖尧>,<Author:杨培杰>]
Author.objects.order_by("-id") #加上一个-号进行逆向排序
[<Author:杨培杰>,<Author:肖尧>,<Author:代国平>]
还有一种方法,是在modles.py的下添加:
class Meta:
ordering=['id']
更新数据:
Author.objects.filter(name="代国平").update(eml="815787213@qq.com")
删除对象:
Author.objects.all().delete() #删除所有
Author.objects.filter(name="杨培杰").delete()