以下信息可能有些并不完整或者有些错误的理解,我会在以后的学习过程中进行修改
Queryset数据类型
QuerySet与惰性机制
所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。
QuerySet特点:
<1> 可迭代
<2> 可切片
<3> 惰性计算和缓存机制
model.py创建表单
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=6,verbose_name="书名")
author = models.ManyToManyField('Author')
publish = models.ForeignKey('Publish', on_delete=models.CASCADE)
price = models.IntegerField()
class Publish(models.Model):
name = models.CharField(max_length = 30)
address = models.CharField(max_length = 50)
class Author(models.Model):
name = models.CharField(max_length = 30)
sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),))
email = models.EmailField()
address = models.CharField(max_length=50)
birthday = models.DateField()
ORM常用的QuerySet接口
增加
单表添加:
1、
表名.objects.create(**kwargs)
Book.objects.create(title="Django 企业开发实战"...)
2、
book = 表名(**kwargs)
book.save()
3、
author = 表名()
author.name = ''
author.save()
一对多添加:
1、
publish_obj = Publish.objects.get(name="人民邮电出版社")
author_obj = Author.objects.get(name="the5file")
Book.objects.create(title="Django 企业开发实战",author=author_obj,publish=publish_obj)
2、
book = Book(title="Django 企业开发实战",author=author_obj,publish=publish_obj)
book.save()
多对多添加:
1、
book = Book.objects.get(title="Django 企业开发实战")
author_obj = Author.objects.get(name="the5file")
book.author.add(author_obj) # 要添加多个只需写多个参数就可以了
add(*objs,bulk = True,through_defaults = None)
2、
book.author = author_obj
book.save()
3、
b = Blog.objects.get(id=1)
e = b.entry_set.create(
headline='Hello',
body_text='Hi',
pub_date=datetime.date(2005, 1, 1)
)
4、
b = Blog.objects.get(id=1)
e = Entry(
blog=b,
headline='Hello',
body_text='Hi',
pub_date=datetime.date(2005, 1, 1)
)
e.save(force_insert=True)
---------------------
查询
1、表名.objects.filter(**kwargs) # 包含与所给筛选条件相匹配的对象,可迭代,可切片
Author.objects.fileter(id=1)
2、表名.objects.all() # 查询所有结果,可迭代,可切片
Author.objects.all
3、表名.objects.get(**kwargs) # 返回与所筛选元素相匹配的对象,返回结果有且只有一个,如果对象不存在或超过一个,则会报错,不建议使用
Author.objects.get(id=1)
4、表名.objects.values(*field) # 返回一个可迭代的字典序列
Author.objects.vlaues('id', 'name', 'address')
5、表名.objects.exclude(**kwargs) # 包含了与所给筛选条件不匹配的对象与filter相反的逻辑
6、基于Queryset的查询
order_by(*field) # 对查询结果排序 加一个-表示降序,不加时升序,随机排列则为'?',即order_by('?'),多次使用order_by,后一个会覆盖前一个,没有参数表示清除所有的排序
reverse() # 对查询结果反向排序
distinct() # 从返回结果中剔除重复的记录
values() # 返回某个字段的值,结果是包含dict的QuerySet
演示:book = Book.objects.filter(id=5).values('title')
还可以用关键字参数,将参数传递给annotate(),给queryset添加属性。
-------------------------
from django.db.models.functions import Lower
Blog.objects.values(lower_name=Lower('name'))
<QuerySet [{
'lower_name': 'beatles blog'}]>
----------------------------------------
另外一种用法,与聚合语句一起使用
-----------------------------------------
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self