复习

单表查询

# 单表操作
# 增
# 方式1
user_obj=models.User.objects.create(**kwargs)  # 之一create
# 方式2
user_obj=models.User(**kwargs)
user_obj.save()

# 查
user_queryset=models.User.objects.filter(**kwargs)  # 多个过滤条件是and关系
user_obj=models.User.objects.get()  # 不推荐使用
users_queryset=models.User.objects.all()  # 惰性查询

# 改
user_queryset=models.User.objects.filter(**kwargs).update(**kwargs)  # 批量更新
user_obj=models.User.objects.filter(**kwargs).first()
user_obj.name='json'
user_obj.save()
user_obj.update()  # 对象没有update方法

# 删
models.User.objects.filter(**kwargs).delete()  # 批量删除
user_obj=models.User.objects.filter(**kwargs).first()
user_obj.delete()

多表查询

表关系:
  • ​ 一对一(OneToOneField)

  • ​ 一对多(ForeignKey)

  • ​ 多对多(ManyToManyField)

外键字段的增删改查

# 一对多字段的增删改查(publish)
# 增
models.Book.objects.create(publish_id=1)

publish_obj=models.Pulish.objects.filter(pk=1).first()
models.Book.objects.create(publish=publish_obj)

# 改
book_obj=models.Book.objects.filter(pk=1).first()
book_obj.publish=new_publish_obj

book_obj=models.Book.objects.filter(pk=1).update(publish_id=2)
book_obj=models.Book.objects.filter(pk=1).update(publish=publish_obj)

# 删
# 删除出版社会级联删除该出版社对应的所有的数据

# 多对多字段增删改查
# 增
add()
# 查

# 改
set() :必须接收一个可迭代对象
# 删
remove()

# 上面是三个都支持多个数字或对象
    清空:clear()

跨表查询

# 正向:关联字段在你当前这张表,查询另一张表
# 反向: 关联字段不在你这张表,查询另一张表
# 正反向总结: 正向查询按字段,反向查询按表名小写(********)

# 基于对象的跨表查询(子查询)
	# 正向
    models.Book.objects.filter(pk=1).first()
    book_obj.publish.addr # (book_obj.publish--->拿到出版社对象)
    book_obj.author  # app01.Auhor.None
    book_obj.author.all()  #
    # 反向
    publish_obj=models.Publish.objects.filter(pk=1).first()
    publish_obj.book_set.all()  # 查询单个数据直接拿,多个数据加个all

# 基于双下划线的跨表查询(联表查询)
	res=models.Book.objects.filter(publish__name='东方出版社',title='瓶梅').values('title','publish__name','author__authordetail__phone')

queryset对象.query 可以查看内部对象的sql语句

all()

filter()

values()

value_list()

order_by()

reverse()

distinct()

exclude()

count() 计数

exist() 布尔值

get() 数据对象本身

first() 返回数据对象本身

last() 返回数据对象本身

聚合函数

from django.db.models import Max,Min,Sum,Count,Avg
# 聚合查询
aggragate()

# 分组查询(group by)
annotate()  group_concat()  concat()

F&Q查询

# 过滤的条件语句,是另外一个条件过滤出来的数据
# 卖出大于库存

# F查询
from djamgo.db.models import F,Q

res=models.Product.objects.filter(maichu__gt=F('kucun'))
print(res)


# 将所有商品的价格提高100块
models.Product.objects.update(price=F('price')+100)


# 将所有商品的名字后面都加一个‘爆款’
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.update(name=Concat(F('name'),Value('爆款')))


# Q查询
from djamgo.db.models import Q
res=models.Product.objects.filter(Q(price=188.88,Q(name='连衣裙爆款')) # and
res=models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款')) # | or 
res=models.Product.objects.filter(Q(price=188.88)|~Q(name='连衣裙爆款')) # | not
                                  
                                  
# Q对象的另外一种用法
form django.db.models import F,Q
 res=models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款')) # | or 
                                  
from django.test import TestCase

# Create your tests here.
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day58.settings")
    import django
    
    django.setup()
    from app01 import models
    
    # 查询卖出数量大于1000的商品
    res = models.Product.objects.filter(salary_count__gt=1000).values('name', 'salary_count')
    print(res)
    
    # 查询卖出数量大于库存数量的商品信息
    from django.db.models import F, Q
    
    res = models.Product.objects.filter(salary_count__gt=F('inventory_count')).values('salary_count', 'inventory_count')
    print(res)
    # 查询卖出数量小于等于库存数量的商品的销售数量和商品库存
    res = models.Product.objects.filter(salary_count__lte=F('inventory_count')).values('salary_count',
                                                                                       'inventory_count')
    print(res)
    
    # 将所有的商品的价格提高100块
    res = models.Product.objects.update(price=F('price') + 100)  # res 是受影响的行数
    print(res)
    
    # 将所有商品的名字后面都加一个爆款
    # 对于字符串的拼接 还需要导入两个模块
    from django.db.models.functions import Concat
    from django.db.models import Value
    
    # models.Product.objects.update(name=Concat(F('name'), Value('1')))
    
    # Q查询
    # Q(filter里面条件都是与,Q支持与或非)
    # 1.查询 卖出数大于100 或者 价格小于100块的
    res = models.Product.objects.filter(Q(salary_count__gt=1000) | Q(price__lt=6000))  # or
    print('Q1', res)
    # 2.查询 库存数是100 并且 卖出数不是0 的产品
    res = models.Product.objects.filter(Q(inventory_count__gt=900), Q(salary_count__gt=1000))  # and
    print(res)
    # 3.查询 产品名包含新款, 并且库存数大于60的
    res = models.Product.objects.filter(Q(name__contains='ipho'), ~Q(inventory_count=1000))  # and
    print(res)
    
     # Q对象补充(******)
    from django.db.models import F, Q
    q = Q()
    q.connector = 'or'  # 通过这个参数可以将Q对象默认的and关系变成or
    q.children.append(('price',188.88))
    q.children.append(('name','高跟鞋爆款'))
    res = models.Product.objects.filter(q)  # Q对象查询默认也是and
    print(res)

    # 事务
    from django.db import transaction
    
    try:
        # 开启事务
        with transaction.atomic():
            # 商品销售数量+1
            models.Product.objects.filter(id=1).update(salary_count=F('salary_count') + 1)
            # 商品库存数量减1
            models.Product.objects.filter(id=1).update(inventory_count=F('inventory_count') - 1)
    except Exception as e:
        print(e)

posted on 2019-06-14 09:05  QzkRainPig  阅读(143)  评论(0编辑  收藏  举报