查询演示所用到的模型类代码
class BookInfo(models.Model):
btitle = models.CharField(max_length=50, verbose_name='标题')
bpub_date = models.DateTimeField(default=datetime.now, verbose_name='发布日期')
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=0, verbose_name='是否删除')
class Meta(object):
db_table = 'book_info'
verbose_name = '书籍信息'
verbose_name_plural = '书籍信息息'
def __str__(self):
return self.btitle
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名称')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
字段选项简单说明
verbose_name = 后台管理界面字段显示的名字
1. CASCADE 级联,删除主表数据时连通一起删除外键表中数据
2. PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
3. SET_NULL 设置为NULL,仅在该字段null=True允许为null时可用
4. SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用
查增删改
----------------基本查询------------------------
# get() 获取一个数据,若多个或不存在会抛出异常
HeroInfo.objects.get(hcomment='弹琴')
# all() 查询多个结果,返回一个类列表
HeroInfo.objects.all()
# count 查询结果数量
HeroInfo.objects.all().count()
----------------过滤查询(条件查询)------------------------
# filter过滤查询,返回一个类列表
# 格式: 属性名称__比较运算符=值
HeroInfo.objects.filter(hgender=1)
# contains 是否包含(模糊查询)
查询hcomment字段中包含 九 的所有对象
HeroInfo.objects.filter(hcomment__contains='九')
# 查询是字段否为空(null)
# 查询btitle字段中值不为空的所有对象
BookInfo.objects.filter(btitle__isnull=False)
# in
# 查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1, 3, 5])
# 比较查询
gt 大于 (greater then)
gte 大于等于 (greater then equal)
lt 小于 (less then)
lte 小于等于 (less then equal)
BookInfo.objects.filter(id__gt=3)
# 查询bread字段值大于等于20并且bcomment字段值大于40的对象
BookInfo.objects.filter(bread__gte=20,bcomment__gt=40)
# 不等于(不包含)查询
# 查询id等于3的所有图书
BookInfo.objects.exclude(id=3)
# startswith、endswith:以指定值开头或结尾
查询btitle字段中以 部 结尾的所有对象
BookInfo.objects.filter(btitle__endswith='部')
# 日期查询
year、month、day、week_day、hour、minute、second
# 查询bpub_date中年份为1980的所有对象
BookInfo.objects.filter(bpub_date__year=1980)
# F和Q对象的使用
from django.db.models import Q
from django.db.models import F
# 查询bread字段中值大于bcomment字段的所有对象
BookInfo.objects.filter(bread__gt=F('bcomment'))
# 查询bread字段中值大于2备bcomment字段值的所有对象
BookInfo.objects.filter(bread__gt=F('bcomment')*2)
# 使用Q对象完成 或 逻辑查询
# 查询bread字段中值等于等于20的,或者bcomment大于40的对象
BookInfo.objects.filter(Q(bread__gte=20) | Q(bcomment__gt=40))
# 与逻辑一般不使用Q对象,对个条件直接逗号连接即可
BookInfo.objects.filter(bread__gte=20,bcomment__gt=40)
----------------------聚合函数-----------------------
Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
# 使用aggregate()过滤器可以调用聚合函数
from django.db.models import Sum,Avg,每一个过滤函数都需要导入
BookInfo.objects.aggregate(Sum('bread'))
返回一个字典{'bread__sum': 126}
BookInfo.objects.aggregate(Avg('bread'))
返回一个字典{'bread__avg': 25.2}
# 排序
BookInfo.objects.all().order_by('bread') # 升序
BookInfo.objects.all().order_by('-bread') # 降序
-------------------关联查询------------------------
# 一对应对的查询
# 一对应的模型类对象.多对应的模型类名小写_set 例:
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()
# 多对应一的查询
# 直接 对象.外键字段名
h = HeroInfo.objects.get(id=1)
h.hbook # 获取到 BookInfo的一个对象
h.hbook_id # 获取到 BookInfo一个对象的id
----------------------------关联过滤查询-----------------
语法: 关联模型类名小写__属性名__条件运算符=值;
关联模型类名小写__属性名=值;表示等于
条件运算符 在上面有详细使用说明
# 查询HeroInfo中hname的值是 虚竹 的所有BookInfo的对象
# 查询英雄名字是虚竹的的所有书籍
BookInfo.objects.filter(heroinfo__hname='虚竹')
# 查询英雄名字包含不的所有书籍
BookInfo.objects.filter(heroinfo__hname__contains='不')
# 修改
hero = HeroInfo.objects.get(id=1)
hero.hname = '猪悟能'
hero.save()
# 使用update修改会返回受到影响的行数,而且不必调用save()方法
HeroInfo.objects.filter(hname='乔峰').update(hname='乔')