Djaong 数据库查询

查询演示所用到的模型类代码

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


# 定义英雄模型类HeroInfo
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 = 后台管理界面字段显示的名字

# on_delete = models.CASCADE 
# 在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

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='乔')


posted @ 2018-06-11 20:15  fanlei5458  阅读(204)  评论(0编辑  收藏  举报