美文网首页我爱编程
QuerySet常规操作

QuerySet常规操作

作者: 流蓝浅 | 来源:发表于2018-04-12 16:56 被阅读0次
示例演示
QuerySet常规操作
创建模型类

from django.db import models

class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()

def __str__ (self):   
    return self.name 

class Author(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()

def __str__ (self):  
    return self.name 

class Entry(models.Model):
blog = models.ForeignKey(Blog)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()

authors = models.ManyToManyField(Author) 
n_comments = models.IntegerField() 
n_pingbacks = models.IntegerField() 
rating = models.IntegerField() 

def __str__(self):  
    return self.headline 

常规操作

  1. QuerySet 创建对象的方法

from blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()

总之,一共有四种方法
From blog.models import Author

方法 1

Author.objects.create(name="Thompson", email="thompson@163.com")

方法 2

twz = Author(name=" Thompson", email=" thompson@163.com")
Python之:Django框架
奇酷学院高级讲师:郭建涛
twz.save()

方法 3

twz = Author()
twz.name=" Thompson"
twz.email=" thompson@163.com"
twz.save()

方法 4,首先尝试获取,不存在就创建,可以防止重复

Author.objects.get_or_create(name="WeizhongTu", email="tuweizhong@163.com")

返回值(object, True/False)

备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,(object,
True/False),创建时返回 True, 已经存在时返回 False
当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来

from blog.models import Entry
from datetime import *
entry = Entry()
entry.headline = 'headline'
entry.body_text = "body text"
entry.pub_date = datetime.now()
entry.mod_date = datetime.now()

entry.n_comments = 1
entry.n_pingbacks = 1
entry.rating = 1
entry.save()
entry.authors.add(author)
entry.save()

entry = Entry.objects.get(pk=1)
cheese_blog = Blog.objects.get(name="Cheddar Talk")
entry.blog = cheese_blog
entry.save()

  1. 获取对象的方法

查询所有

Entry.objects.all()

切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引

Entry.objects.all()[:10]

get是用来获取一个对象,多个会报错

Author.objects.get(name="Thompson")
如果需要获取满足条件的多个人,就要用到filter
Python之:Django框架
奇酷学院高级讲师:郭建涛
Author.objects.filter(name="abc")
Author.objects.filter(name__iexact="abc")

名称中包含 "abc"的人

Author.objects.filter(name__contains="abc")

名称中包含 "abc",且abc不区分大小写

Author.objects.filter(name__icontains="abc")

Author.objects.filter(name__regex="^abc") # 正则表达式查询
Author.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写

  1. 删除符合条件的结果
    得到满足条件的结果,然后 delete 就可以(危险操作,正式场合操作务必谨慎)

Author.objects.filter(name__contains="abc").delete() # 删除 名称中包含 "abc"的人

如果写成
people = Author.objects.filter(name__contains="abc")
people.delete()
效果也是一样的,Django实际只执行一条 SQL 语句。

  1. 更新某个内容
    (1) 批量更新,适用于 .all() .filter() .exclude() 等后面 (危险操作,务必谨慎)

名称中包含 "abc"的人 都改成 xxx

Author.objects.filter(name__contains="abc").update(name='xxx')
(2) 单个 object 更新,适合get(), get_or_create(), update_or_create() 等得到的 obj,
和新建很类似。

twz = Author.objects.get(name="Tom")
twz.name="Tom"
twz.email="Tom@163.com"
twz.save() # 最后不要忘了保存!!!

  1. QuerySet 是可迭代的,比如:

es = Entry.objects.all()
for e in es:
print(e.headline)
Entry.objects.all() 或者 es 就是 QuerySet 是查询所有的 Entry 条目。

  1. 检查 Entry 中是否有对象
     如果只是检查 Entry 中是否有对象
    Entry.objects.all().exists()
     QuerySet切片

Entry.objects.all()[:10] #取出10条,可以节省内存
 查询集的数量
Entry.objects.count()
 强行将 QuerySet 变成 列表
list(Entry.objects.all())

  1. QuerySet 查询结果排序
    作者按照名称排序

Author.objects.all().order_by('name')
Author.objects.all().order_by('-name') # 在 column name 前加一个负号,可以实现倒序

  1. QuerySet 支持链式查询

Author.objects.filter(name__contains="WeizhongTu").filter(email="tuweizhong@163.com")
Author.objects.filter(name__contains="Wei").exclude(email="tuweizhong@163.com")

找出名称含有abc, 但是排除年龄是23 岁的

Person.objects.filter(name__contains="abc").exclude(age=23)
QuerySet进阶操作
创建模型类
from django.db import models

class Author(models.Model):
name = models.CharField(max_length=50)

qq = models.CharField(max_length=10) 
addr = models.TextField() 
email = models.EmailField() 

def __str__(self): 
    return self.name 

class Article(models.Model):
title = models.CharField(max_length=50)
author = models.ForeignKey(Author)
content = models.TextField()
score = models.IntegerField() # 文章的打分
tags = models.ManyToManyField('Tag')

def __str__(self): 
    return self.title 

class Tag(models.Model):
name = models.CharField(max_length=50)

def __str__(self): 
    return self.name 

比较简单,假设一篇文章只有一个作者(Author),一个作者可以有多篇文章(Article),一篇
文章可以有多个标签(Tag)。
values_list 获取元组形式结果
比如我们要获取作者的 name 和 qq
authors = Author.objects.values_list('name', 'qq')

使用list处理一下
list(authors)

如果只需要 1 个字段,可以指定 flat=True
Author.objects.values_list('name', flat=True)
values 获取字典形式的结果
比如我们要获取作者的 name 和 qq
Author.objects.values('name', 'qq')
list(Author.objects.values('name', 'qq'))
Article.objects.filter(author__name='twz915').values('title')

注意:

  1. values_list 和 values 返回的并不是真正的 列表 或 字典,也是 queryset,他们也是
    lazy evaluation 的(惰性评估,通俗地说,就是用的时候才真正的去数据库查)

  2. 如果查询后没有使用,在数据库更新后再使用,你发现得到在是新内容!!!如果想要旧
    内容保持着,数据库更新后不要变,可以 list 一下

  3. 如果只是遍历这些结果,没有必要 list 它们转成列表(浪费内存,数据量大的时候要更
    谨慎!!!)

相关文章

  • QuerySet常规操作

    示例演示 QuerySet常规操作 创建模型类 from django.db import models clas...

  • Django学习-第十讲(上):QuerySet API 学习

    1. QuerySet API 所以我们如果想要学习ORM模型的查找操作,首先要学会QuerySet上的一些API...

  • 4.7 django 模型QuerySet API

    QuerySet API: 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作。其实模型名字...

  • Django----数据库交互QuerySet

    QuerySet API: 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作。其实模型名字...

  • 最浅显易懂的Django系列教程(21)-QuerySetapi

    QuerySet API: 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作。其实模型名字...

  • Django ORM 的基石 —— QuerySet

    获取 QuerySet ORM 基于 QuerySet 工作。我们可以对从数据库中获得的 QuerySet 使用若...

  • 常规操作

    2018-08-30 第一件事。服务器上的一个ip突然就访问不到了。本机ping了一下没通,返回的是另一个ip给的...

  • 常规操作

    对于大多数人来说,就是清理衣橱和更新服装这样简单的改变也是如此艰难。很多人出去购买新衣服,但样式没有更新。 For...

  • 常规操作

    从阳台看 楼下测核酸的队伍 成了一条弯曲且盘旋的长蛇 工作不是每天必做的 排队是每天的常规操作

  • django数据库查询

    条件选取querySet的时候,filter表示=,exclude表示!=。querySet.distinct()...

网友评论

    本文标题:QuerySet常规操作

    本文链接:https://www.haomeiwen.com/subject/opztkftx.html