前言
- 通过上一个笔记的学习,我们大致明白了Django怎么从Views 传到url中然后在templates中进行显示内容。这一篇我们讲学习models控制数据库数据进行操作。相关内容如下:
- Django Models中相关的字段
- Django ORM模式的理解
- Django Models操作
例子
上一篇的源代码中blog目录下的Models.py中建立了相关的数据类。只需要执行如下命令就能在相应的数据库中建立表。源代码https://github.com/Huseck/Django-study/tree/Django-study-3
需要配置mysql的连接信息,以及创建数据库。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16$python manage.py makemigrations
$python manage.py migrate
#之后我们进行数据操作
$python manage.py shell #进入shell命令下进行操作
>>>from blog.models import New #导入所需的模块
>>>from datetime import *
#进行数据的增、删、改、查
>>>New.objects.create(title="test1",body='test1',created_time=datetime.now(),modified_time=datetime.now(),author_id=1,category_id=1)
>>>New.objects.get(title='test1').delete()
>>>N=New.objects.get(title='seck')
>>>N.body=('seck-test')
>>>N.save()
#进行查操作显示数据的时候,注意要在Models.py中进行添加
def __unicode__(self):
return self.title
#其他filter 切片等操作自行百度学习
例子三
本例子中我们学习models模型操作数据库。
首先还是新建项目
settings.py中配置Mysql1
2
3
4
5
6
7
8
9
10DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django-model',
'USER': 'root',
'PASSWORD': 'pass',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
然后创建app models.py代码如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#coding:utf-8
from django.db import models
# Create your models here.
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
class Author(models.Model):
name = models.CharField(max_length=50)
qq = models.CharField(max_length=10)
addr = models.TextField()
email = models.EmailField()
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=50)
author = models.ForeignKey(Author)
content = models.TextField()
score = models.IntegerField() # 文章的打分
tags = models.ManyToManyField('Tag')
def __str__(self):
return self.title
class Tag(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
导入数据 initdb.py1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46#!/usr/bin/env python
#-*- coding:utf-8 _*-
"""
author:seck
time: 2018/01/26
"""
import random
from blog_week_5.wsgi import *
from Model_study.models import Author, Article, Tag
author_name_list = ['xjnu', 'seck', 'sfdx', 'test', 'xjseck']
article_title_list = ['Django 笔记', 'Python 学习', 'HTML 学习']
def create_authors():
for author_name in author_name_list:
author, created = Author.objects.get_or_create(name=author_name)
# 随机生成9位数的QQ,
author.qq = ''.join(
str(random.choice(range(10))) for _ in range(9)
)
author.addr = 'addr_%s' % (random.randrange(1, 3))
author.email = '%s@seck.com' % (author.addr)
author.save()
def create_articles_and_tags():
# 随机生成文章
for article_title in article_title_list:
# 从文章标题中得到 tag
tag_name = article_title.split(' ', 1)[0]
tag, created = Tag.objects.get_or_create(name=tag_name)
random_author = random.choice(Author.objects.all())
for i in range(1, 21):
title = '%s_%s' % (article_title, i)
article, created = Article.objects.get_or_create(
title=title, defaults={
'author': random_author, # 随机分配作者
'content': '%s 正文' % title,
'score': random.randrange(70, 101), # 随机给文章一个打分
}
)
article.tags.add(tag)
def main():
create_authors()
create_articles_and_tags()
if __name__ == '__main__':
main()
print("Done!")
Django queryset 进行的操作
查看所执行的SQL语句
1
2
3
4
5
6
7
8$python manage.py shell
>>>from Model_study.models import Article,Author,Tag
>>> print str(Author.objects.all().query) #打印所执行的sql语句
>>> Author.objects.all().query.__str__() #这样也可以(只对select有用)
>>> Author=Author.objects.values_list('name','qq')
>>> Author #以元祖形式输出结果
>>> Author.objects.values_list('name',flat=True) #指定一个字段
>>> Article.objects.filter(author__name='xjnu').values_list('title',flat=True) #多表查询查询结果排序
1
2>>>Author.objects.all().order_by('name')
>>> Author.objects.all().order_by('-name'); #倒序排列支持正则 Where 查询
1
2
3>>>Author.objects.filter(name__regex='^s.+').exclude(qq=399753917)
#字段名+ 两个下划线 参考https://www.cnblogs.com/BigJ/p/7530516.html
#exclude 类似SQL语句的where索引查询
1
2
3>>> Author.objects.all()[:1] #不支持负数
>>> Author.objects.all().reverse()[0]
>>> Author.objects.order_by('-id')[0]和SQL语句进行显示调试,此方法能显示所有执行的sql语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24首先在settings.py最后加上
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG' if DEBUG else 'INFO',
},
},
}
然后在$python manage.py shell
下进行操作会显示sql语句
>>> from Model_study.models import Article,Author ,Tag
>>> a=Article.objects.get(pk=1)
(0.000) SET SQL_AUTO_IS_NULL = 0; args=None
(0.000) SET SQL_AUTO_IS_NULL = 0; args=None
(0.000) SELECT `Model_study_article`.`id`, `Model_study_article`.`title`, `Model_study_article`.`author_id`, `Model_study_article`.`content`, `Model_study_article`.`score` FROM `Model_study_article` WHERE `Model_study_article`.`id` = 1; args=(1,)
>>>
5.其他常见的操作可以搜索相关的资料
结束语
本篇中我们主要学习models中对象中的相关操作,常用的数据操作,熟练掌握,后面会对我们实际项目开发中事半功倍,然后介绍Django的ORM怎么操作一对一、一对多、多对多的操作。
Powered by HyperComments