创建数据模型后,Django 自动给予你一套数据库抽象 API,允许你创建,检索,更新和删除对象。本章节介绍django的数据库查询操作。
一个models类的实例表示数据库表中的一行数据。
使用django shell
[root@localhost mysite]# python3 manage.py shell
Python 3.6.8 (default, Aug 7 2019, 17:28:10)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from myapp.models import Person
>>> from myapp.models import Person
>>> p = Person(first_name='太白',last_name='李')
>>> p.save()
#save()是将数据插入到表中,也可以通过create()直接创建对象并插入:
>>> p1=Person.objects.create(first_name='游',last_name='陆')
>>> p1.first_name='务观'
>>> p1.save()
p1.delete()
查询全部数据,方法 all() 返回了一个包含数据库中所有对象的 QuerySet 对象。
>>> all_person=Person.objects.all()
通过过滤器增加查询条件,过滤器也返回 QuerySet 对象。
>>> persons=Person.objects.filter(last_name='陆')
>>> for person in persons:
... print(person.last_name,person.first_name)
...
陆 务观
>>> persons=Person.objects.filter(last_name='陆').exclude(first_name='游')
>>> person=Person.objects.get(id=1) #通过id查询,pk表示主键与id作用相同
>>> person=Person.objects.get(pk=1)
#返回前5条数据
Person.objects.all()[:5]
#返回6-10条数据
Person.objects.all()[5:10]
这里对__lookuptype的可用选项进行列举
__lookuptype选项 | 含义 |
---|---|
__exact | 等于 like 'xxx' |
__iexact | 等于忽略大小写 ilike 'xxx' |
__contains | 包含字符串 like '%xxx%' |
__icontains | 包含字符串忽略大小写 ilike '%xxxx%' |
__gt | 大于某个值(数字或日期) |
__gte | 大于等于某个值(数字或日期) |
__lt | 小于某个值(数字或日期) |
__lte | 小于等于某个值(数字或日期) |
__in | 存在于一个list范围内 |
__startswith | 以特定字符开头 |
__istartswith | 以特定字符开头并忽略大小写 |
__endswith | 以特定字符结尾 |
__iendswith | 以特定字符结尾并忽略大小写 |
__range | 在某个范围内 |
__year | 日期字段的年份 |
__month | 日期字段的月份 |
__day | 日期字段的日 |
__isnull=True/False | 是否为空 |
from django.db.models import Q
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
上面的查询转化为sql语句为: SELECT * from polls WHERE question LIKE 'Who%' AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
可见Q可以用来作or查询。
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')
注意:objects.get和objects.filter方法的区别,get只返回一个实例对象(get操作没有查找到数据或者查找到多个数据都会有异常),而all与filter返回多个对象的集合(像一个数组),如下表所示:
>>> from myapp.models import Person
>>> p=Person.objects.get(last_name='李')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib64/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib64/python3.6/site-packages/django/db/models/query.py", line 422, in get
num if not limit or num < limit else 'more than %s' % (limit - 1),
myapp.models.Person.MultipleObjectsReturned: get() returned more than one Person -- it returned 2!
>>> p=Person.objects.filter(last_name='李')
>>> p=Person.objects.get(last_name='王')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib64/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib64/python3.6/site-packages/django/db/models/query.py", line 417, in get
self.model._meta.object_name
myapp.models.Person.DoesNotExist: Person matching query does not exist.
总结:本章主要介绍了models 查询的,增save()、删delete()、改,查操作,查询操作主要方法get()、filter()、all()、exclude()、Q查询等。对于查询结果可以通过.values()获取特定字段,order_by()按某个字段排序。