前提条件:
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方法,所有数据将会被删除,慎用