others linux服务器运维 django3 监控 k8s golang 数据库 大数据 前端 devops 理论基础 java oracle 运维日志

django models 模型查询 -- making queries

访问量:1378 创建时间:2020-01-14

创建数据模型后,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='游')

django模型使用get()获取单个对象

>>> person=Person.objects.get(id=1) #通过id查询,pk表示主键与id作用相同
>>> person=Person.objects.get(pk=1)

限制 QuerySet 条目数

#返回前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 是否为空

sql语句where包含字符串的查询

django Q 对象进行或查询

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查询。

django进行批量数据修改

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()按某个字段排序。

登陆评论: 使用GITHUB登陆