django模型操作数据库的常用方法——基本数据访问

前提条件:

1.  此处假定有一个app叫books,该books的模型定义如下:

# -*- coding:utf-8 -*-
from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __str__(self):  #此方法可以让模型知道如何显示它自己
        return self.name

    class Meta:     #此类下的可选项有很多
        ordering = ['name']     #指定此类输出时默认的排序方式(按name排序)

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_time = models.CharField(max_length=40)
    email = models.EmailField()

    def __str__(self):
        return '{first_name} {last_name}'.format(first_name=self.first_name, last_time=self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    def __str__(self):
        return self.title

2. 在一个django项目中,运行 python  manage.py  shell   进入shell模式

在shell命令行中展示基本数据访问方法:

1. 两步完成对象的创建与存储至数据库

>>> from books.models import Publisher
>>> p1=Publisher(name='chuntian',address='123',city='xian',state_province='shanxi',country='china',website='http://www/123.com')   #实例化Publisher类,执行此句后,数据库里没有该条数据
>>> p1.save()  #调用该对象的save()方法,才能将该数据保存至数据库

2. 一步到位完成对象的创建与存储至数据库

>>> from books.models import Publisher
>>> p2=Publisher.objects.create(name='shine',address='456',city='tianjin',state_province='shanghai',country='china',website='http://www.555.com')  #使用create方法,一步到位向数据库中写数据

又插入两条数据后,当前数据库中的记录为:

3. 获取对象列表(从给定的模型中取出所有记录)

注:此处获得的结果看起来像一个list,但是它实际上是一个QuerySet对象,这个对象是数据库中一些记录的集合

>>> p_list = Publisher.objects.all()
>>> print p_list
[<Publisher: ahua>, <Publisher: chuntian>, <Publisher: huaxi>, <Publisher: luoyiren>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>]    #此处获取到这么多,是因为我添加的多,就用1.2方法添加的数据

4.数据过滤

注: 此处返回的是一个仿列表(QuerySet),若过滤没结果,则返回空列表(QuerySet),不会导致异常

>>> cc = Publisher.objects.filter(name='shine')   #过滤出name='shine'那条记录
>>> print cc
[<Publisher: shine>]

5.获取单个对象

注: 此处返回的是单个对象,若结果为多个对象,会导致抛出异常,若查询没结果,也会导致异常

>>> dd = Publisher.objects.get(name='chuntian')   #使用get方法获取单个对象
>>> print dd
chuntian

6. 数据排序

默认排序:

>>> dd = Publisher.objects.all()   #此处是按模型中指定的默认排序方式 (即模型中写的按name排序)
>>> print dd
[<Publisher: ahua>, <Publisher: chuntian>, <Publisher: huaxi>, <Publisher: luoyiren>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>]

正序:

>>> cc = Publisher.objects.order_by('address')    #指定按address排序
>>> print cc
[<Publisher: chuntian>, <Publisher: shine>, <Publisher: xiaohong>, <Publisher: xiaoming>, <Publisher: huaxi>, <Publisher: ahua>, <Publisher: luoyiren>]    #结果中展示的是name,是因为模型中要求它是用name来展示自己的

逆序:

>>> cc = Publisher.objects.order_by("-address")   #按address逆向排序
>>> print cc
[<Publisher: xiaoming>, <Publisher: huaxi>, <Publisher: ahua>, <Publisher: luoyiren>, <Publisher: xiaohong>, <Publisher: shine>, <Publisher: chuntian>]

注:此处正序和逆向差别这么大,是因为有4条记录的address是相同的,当address相同时,又会按照默认排序进行排序

7. 数据的模糊查找(类似sql中的like查找)

注:like查找的sql语句为:

SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE name LIKE '%xiao%';
>>> ff = Publisher.objects.filter(name__contains='xiao')  #name和contains之间有双下划线,这里的contains部分会被Django翻译成like语句
>>> print ff
[<Publisher: xiaohong>, <Publisher: xiaoming>]
>>> 

8. 连锁查询 (满足类似 需要同时进行过滤和排序查询操作  的需求)

>>> cc = Publisher.objects.filter(address='xianla').order_by("-name")   #此处既有过滤又有排序
>>> print cc
[<Publisher: xiaoming>, <Publisher: luoyiren>, <Publisher: huaxi>, <Publisher: ahua>]

 9. 限制返回数据

没有限制返回结果的:

>>> cc = Publisher.objects.order_by('-name')   #按name逆序获得数据
>>> print cc
[<Publisher: xiaoming>, <Publisher: xiaohong>, <Publisher: shine>, <Publisher: luoyiren>, <Publisher: huaxi>, <Publisher: chuntian>, <Publisher: ahua>]

有限制返回结果的:

>>> cc = Publisher.objects.order_by('-name')[0:3]   #此处类似list中的切片,但是不支持负索引
>>> print cc
[<Publisher: xiaoming>, <Publisher: xiaohong>, <Publisher: shine>]

10 . 更新多个对象

指定更新的字段名:

>>> cc = Publisher.objects.filter(name='shine').update(name='myshine')
>>> print cc    #返回1,说明更新了一条记录
1  
>>> cc = Publisher.objects.filter(address='xianla').update(address='xianan')
>>> print cc   #返回4,说明更新了4条记录
4

此时数据库中的记录为:

不指定更新的字段名:

>>> update_data = {'name':'wangxiaohua', 'address':'leshuidadao', 'city':'beijing'}
>>> cc = Publisher.objects.filter(name='ahua').update(**update_data)   #传的参数为字典,更利于代码复用
>>> print cc
1

此时数据库中的记录为:

11. 删除对象

方法一:

>>> p = Publisher.objects.get(name='huaxi')
>>> p.delete()

此时数据库中的数据为:

方法二:

>>> Publisher.objects.filter(name='xiaohong').delete()

方法三:

>>> Publisher.objects.all().delete()           #一旦使用all方法,所有数据将会被删除,慎用
原文地址:https://www.cnblogs.com/mujinxinian/p/7889847.html