微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django Models和ORM框架

数据库的配置

1    django支持sqlite,MysqL,oracle,postgresql数据库

     <1> sqlite

            django认使用sqlite的数据库自带sqlite的数据库驱动,引擎名称:django.db.backends.sqlite3

     <2> MysqL

            引擎名称:django.db.backends.MysqL

2    MysqL驱动程序

   MysqLdb(MysqL python)        对python2支持比较好

   MysqLclient

   MysqL

   PyMysqL(纯python的MysqL驱动程序)    对python3支持

3     在django的项目中会认使用sqlite数据库,在settings里有如下设置:

 如果我们想要更改数据库,需要修改如下:

4.创建数据库和更新数据库命令

        创建数据库    python manage.py makemigrations  

        更新数据库    python manage.py migrate 

Django MysqL数据库连接设置:

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

no module named MysqLdb报错解决方法:

这是因为django认你导入的驱动是MysqLdb,可是MysqLdb对于py3有很大问题,所以我们需要的驱动是PyMysqL

项目名文件下的__init__,在里面写入:

# 路径,项目名称/__init__.py

import pyMysqL
pyMysqL.install_as_MysqLdb()

使用小技巧:

    字段别名

# 应用软件/models.py

class Book(models.Model):
    name = models.CharField(max_length=30,verbose_name='书名')
    price = models.IntegerField('价格')

ORM

单表操作:

数据表添加两种方法

# 第一种

b =Book(name='python基础',price=99,author='lily',pub_date='2017-02-02')
b.save()

# 第二种

Book.objects.create(name='python基础', price=99, author='yuan', pub_date='2017-02-02')

数据表修改

# 第一种    推荐使用

Book.objects.filter(author='lily').update(price=999)

# 第二种

b = Book.objects.filter(author='lily')
b[0].price = 100
b[0].save()

数据表删除

Book.objects.filter(author='lily').delete()

数据表查询

        filter(**kwargs)        包含于筛选条件想相匹配的对象

        all()                          查询所有结果

        get(**kwargs)          返回筛选条件相匹配的对象,返回结果只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误

        下面方法都是对查询的结果进行二次处理:比如objects.filter.values()

        value(*filed)            返回一个ValueQuerySet,一个特殊的QuerySet,运行后得到的并不是一系列model实例化对象,而是一个可迭代的字典序列

        excluds(**kargs)     包含于所给刷选条件不匹配的对象

        order_by(*field)      对查询结果排序

        reverse()                 对查询结果反向排序

        distinct()                从返回结果中剔除重复记录

        values_list(*field)   与values()非常相似,但是返回的是一个元组序列,values返回的是一个字典序列

        count()                   返回数据库中匹配查询(QuerySet)的对象数量

        first()                      返回第一条记录

        last()                       返回最后一条记录

        exists()                    如果匹配查查包含数据,则返回True,否则返回False

模糊查询(双下划线)

        __lt         小于

        __gt        大于

多表操作之一对多

查询记录(通过对象)

1 正向查询代码示例:

book_obj = Book.objects.get(name='python基础')
print(book_obj.publish.name)       # 书籍对象对应的出版社对象
print(book_obj.publish.city)
print(type(book_obj.publish))
---------------------------
北京大学出版社                                                                                                                                       
北京                                                                                                                                                 
<class 'app.models.Publish'>

2 反向查询

查询人民出版社出国的所有书籍名字和价格示例

# 正向查询

pub_obj = Publish.objects.filter(name='人民出版社')[0]
res = Book.objects.filter(publish=pub_obj).values('name','price')
print(res)

# 反向查询

pub_obj = Publish.objects.filter(name='人民出版社')[0]
res1 =pub_obj.book_set.all().values('name','price')
# book_set 是Publish的外键
print(res1)
------------------------------------------------------------------------------------
<QuerySet [{'price': 33, 'name': 'java'}, {'price': 22, 'name': 'python'}]>

3.查询记录方法: filter().values() 双下划线(推荐写法)

查询人民出版社出国的所有书籍名字和价格代码示例

查询人民出版社所属的书籍名字和价格
res2 = Book.objects.filter(publish__name='人民出版社').values('name','price')
print(res2)
---------------------------------------------------------------------------
<QuerySet [{'price': 33, 'name': 'python'}]>


# 查询python这本书的出版社名字

res3 = Publish.objects.filter(book__name='python').values('name')
print(res3)


# 查询python这本书的出版社名字

res4 = Book.objects.filter(name='python').values('publish__name')
print(res4)
------------------------------------
<QuerySet [{'name': '人民出版社'}]>

# 查询属于北京出版社的所有书的名字

res5 = Book.objects.filter(publish__city='北京').values('name')
print(res5)
----------------------------------------------------------
<QuerySet [{'name': 'python基础'}, {'name': 'liunx运维'}]>

# 查询上半年之间的书籍

res6 = Book.objects.filter(pub_date__lt='2017-06-01',pub_date__gt='2017-01-01').values('name')
print(res6)
------------------------------------------------------------------------------------------------
<QuerySet [{'name': 'python基础'}, {'name': 'liunx运维'}, {'name': 'java'}, {'name': 'python'}]>

注意:publish__name 中publish是Book表中外键名

多表操作(多对多)

        创建多对多关系    authors = models.ManyToManyField('Author')

F查询和Q查询

Q和filter混合使用

from django.db.models import Q
res = Book.objects.filter(Q(name='Go'), price=77)
print(res)


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐