Django中的models函数&ORM

一、数据库的配置

1、sqlite数据库

django默认支持

2、mysql数据库的配置

首先安装pymysql库

首先在django项目的settings.py文件中将默认的配置注释掉

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }

然后将mysql设置为django的默认数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dj',    # 你的数据库名称
        'USER': 'root',   # 你的数据库用户名
        'PASSWORD': '123456',  # 你的数据库密码
        'HOST': '',  # 你的数据库主机,留空默认为localhost
        'PORT': '3306',  # 你的数据库端口
    }
}
View Code

在然后在项目的__init__().py文件内添加代码

import pymysql


pymysql.install_as_MySQLdb()

3、创建表

在models.py文件中

eg:创建一张表

class Book(models.Model):
    name = models.CharField(max_length=25)
    price = models.IntegerField

在命令行窗口依次执行

python manage.py makemigrations

python manage.py migrate 

结果成功创建blog_book表,表名默认为app名_类名           |

+----------------------------+ 
| blog_book                  |
+----------------------------+

二、 向表中添加数据(

eg:

ef index(request):
    if request.method == 'POST':
        Book.objects.create(name=request.POST['name'], price=request.POST['price'])
        return redirect('dat')
    else:
        return render(request, 'index.html')

三、修改表中数据(

a、用filter,filter返回的是一个queryset集合,这个集合有一个update方法

eg:将bbu这本书的名字改为俄罗斯方块从入门到精通

Book.objects.filter(name='bbu').update(name='俄罗斯方块从入门到精通')

b、用get,get返回的是一个model对象,没有update方法

eg:将python这本书的价格增加到120

pri = Book.objects.get(name='python')
    pri.price = 120
    pri.save()

四、删除表中数据(

调用filter返回的queryset对象的delete方法

eg:将python这本书删除

Book.objects.filter(name='python').delete()

五、查(单表)

1、查询API:all()方法

返回包含数据库中所有对象的queryset

eg:查询所有书籍

def data(request):
    datas = Book.objects.all()
    return render(request, 'data.html', locals())

html文件

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% for data in datas %}
    <p>书名:{{ data.name }}&nbsp&nbsp&nbsp价格:{{ data.price }}</p>
    <p></p>
{% endfor %}
</body>
</html>
View Code

结果

书名:俄罗斯方块从入门到精通   价格:123.0
书名:我的世界   价格:88.0
书名:俄罗斯方块从入门到精通   价格:22.0
书名:我们的青春   价格:220.0
书名:三毛流浪记   价格:55.0
书名:三毛流浪记2   价格:45.0
书名:小兵张嘎   价格:21.0
View Code

 2、filter(**kwargs)方法

返回一个包含对象的集合,满足参数中的条件

eg:查询小兵张嘎这本书的价格

def data(request):
    datas = Book.objects.filter(name='小兵张嘎')
    return render(request, 'data.html', locals())

结果

书名:小兵张嘎   价格:21.0

 3、exclude(**kwargs)方法

返回一个包含对象的集合,不满足参数中的条件

eg:查询所有书籍,除了小兵张嘎

def data(request):
    datas = Book.objects.exclude(name='小兵张嘎')
    return render(request, 'data.html', locals()) 

结果

书名:俄罗斯方块从入门到精通   价格:123.0

书名:我的世界   价格:88.0

书名:俄罗斯方块从入门到精通   价格:22.0

书名:我们的青春   价格:220.0

书名:三毛流浪记   价格:55.0

书名:三毛流浪记2   价格:45.0
View Code

 4、get(**kwargs)方法、first()方法:返回第一组数据、last()方法:返回最后一组数据

返回一个model对象,不可遍历,符合筛选条件的对象超过一个或者没有均会报错

5、values(**kwargs)方法

返回一个特殊的queryset对象,一个可迭代的字典对象,作用:将表中的固定字段拿出

eg:查询所有书的名字

def data(request):
    datas = Book.objects.all().values('name')
    return render(request, 'data.html', locals()) 

结果

书名:俄罗斯方块从入门到精通 

书名:我的世界   

书名:俄罗斯方块从入门到精通   

书名:我们的青春   

书名:三毛流浪记   

书名:三毛流浪记2   

书名:小兵张嘎 
View Code 

6、values_list():返回的是一个元组序列

7、distinct():将数据去重

eg:将书名相同的书籍去重

def data(request):
    datas = Book.objects.all().values('name').distinct()
    return render(request, 'data.html', locals())

结果

书名:俄罗斯方块从入门到精通   :

书名:我的世界   

书名:我们的青春   

书名:三毛流浪记   

书名:三毛流浪记2   

书名:小兵张嘎   
View Code

8、count():计数

eg:统计有多少本书

def data(request):
    datas = Book.objects.all().values('name')
    num_book = Book.objects.all().count()
    return render(request, 'data.html', locals())

结果

书名:俄罗斯方块从入门到精通   

书名:我的世界   

书名:俄罗斯方块从入门到精通  :

书名:我们的青春   

书名:三毛流浪记   

书名:三毛流浪记2   

书名:小兵张嘎   

共有7本书
View Code

9、模糊查询

eg:查询书名为“三毛”开头的书籍信息

def data(request):
    datas = Book.objects.filter(name__contains='三毛')
    return render(request, 'data.html', locals())

结果

书名:三毛流浪记   价格:55.0

书名:三毛流浪记2   价格:45.0

10、链式过滤

所谓链式过滤就是在queryset的基础上再次进行过滤

相当于将一条sql语句的结果当作另一条sql语句的条件

eg:查询价格为22元的俄罗斯方块(用链式过滤的方法)

def data(request):
    datas = Book.objects.filter(name='俄罗斯方块从入门到精通').filter(price=22)
    return render(request, 'data.html', locals())

结果

书名:俄罗斯方块从入门到精通   价格:22.0

 

posted @ 2018-05-09 23:07  sumcet  阅读(568)  评论(0编辑  收藏  举报