导航
导航
文章目录
  1. 前言
  2. 例子
  3. 例子三
  4. 结束语

Django学习笔记(三)

前言

  1. 通过上一个笔记的学习,我们大致明白了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中配置Mysql

1
2
3
4
5
6
7
8
9
10
DATABASES = {
'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
@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
@python_2_unicode_compatible
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
@python_2_unicode_compatible
class Tag(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name

导入数据 initdb.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
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 进行的操作

  1. 查看所执行的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) #多表查询
  2. 查询结果排序

    1
    2
    >>>Author.objects.all().order_by('name') 
    >>> Author.objects.all().order_by('-name'); #倒序排列
  3. 支持正则 Where 查询

    1
    2
    3
    >>>Author.objects.filter(name__regex='^s.+').exclude(qq=399753917)
    #字段名+ 两个下划线 参考https://www.cnblogs.com/BigJ/p/7530516.html
    #exclude 类似SQL语句的where
  4. 索引查询

    1
    2
    3
    >>> Author.objects.all()[:1]  #不支持负数
    >>> Author.objects.all().reverse()[0]
    >>> Author.objects.order_by('-id')[0]
  5. 和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