栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

django orm鏌ヨ浼樺寲_django orm鎿嶄綔?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

django orm鏌ヨ浼樺寲_django orm鎿嶄綔?

Q查询
"""Q查询"""
    # filter括号内多个条件均为and关系
    # 1.查询主键为3或者卖出数为1000的数据
    # res = models.Book.objects.filter(pk=3, maichu=1000)  # 逗号分隔为and关系
    from django.db.models import Q

    ###########基本用法###########
    # res = models.Book.objects.filter(Q(pk=3), Q(maichu=1000))  # 逗号分隔为and关系
    # res = models.Book.objects.filter(Q(pk=3) | Q(maichu=1000))  # |分隔为or关系
    # res = models.Book.objects.filter(~Q(pk=3) | Q(maichu=1000))  # ~分隔为not关系
    # print(res)
    ###########进阶用法###########
    # filter(title='123') filter('title'='123')
    q = Q()  # 默认多个条件之间也是and关系
    q.connector = 'or'  # 也可以修改链接关系
    # q.children.append(('title', '三国演义爆款'))
    q.children.append(('title__contains', '爆'))
    q.children.append(('price', 1123))
    res = models.Book.objects.filter(q)
    print(res)
orm事务操作
"""
事务:ACID
		A原子性
		C一致性
		I独立性
		D持久性
start transaction
...
rollback
commit
"""
from django.db import transaction
    # 事务
    # 买一本 跟jason学Linux 书
    # 在数据库层面要做的事儿
    # 1. 创建一条订单数据
    # 2. 去产品表 将卖出数+1, 库存数-1
    from django.db.models import F
    # 开启事务处理
    try:
        with transaction.atomic():
            # 创建一条订单数据
            models.Book.objects.create(num="110110111", product_id=1, count=1)
            # 能执行成功
            models.Book.objects.filter(id=1).update(kucun=F("kucun") - 1, maichu=F("maichu") + 1)
    except Exception as e:
        print(e)
        transaction.rollback()  # 回滚
        transaction.commit()  # 提交
orm常用字段
# verbose_name  中文标识
AutoField()  # 专门用于主键
	"""需要指定primary key参数"""
CharField()
	"""需要指定max_length参数  varchar()"""
IntegerField()
DecimalField()
DateField()
DateTimeField()
	"""
	auto_now	  每次更新数据记录的时候会更新该字段
	auto_now_add  创建数据记录的时候会把当前时间添加到数据库
	"""
BooleanField()  # 布尔值类型
	"""
	传布尔值 存0或1
		is_delete = models.BooleanField()
		is_alive = models.BooleanField()
		is_buy = models.BooleanField()
	"""
TextField()  # 文本类型
	"""
	专门用于存储大段文本数据
		比如文章内容...
	"""
EmailField()  # 邮箱类型
FileField()
        - 字符串,路径保存在数据库,文件上传到指定目录
        - upload_to = ""    上传文件的保存路径
DecimalField(Field)
        - 10进制小数
        - 参数:
            max_digits,小数总长度
            decimal_places,小数位长度
        
"""自定义字段:为了防止django版本与最新的数据库产生差异"""
class MyCharField(models.Field):
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super().__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
        return 'char(%s)' % self.max_length
    
# 重要参数
	null = True
    default = None
    unique  如果设置为unique=True 则该字段在此表中必须是唯一的 。
    db_index  如果db_index=True 则代表着为此字段设置索引。
# 外键字段
	to、to_field、on_delete、related_name(给外键字段起别名 用于正反向)
    db_constraint
    """自行总结django1.X与django2.X|3.X外键字段使用的区别"""
orm查询优化
only与defer
select_related与prefetch_related


"""1.在ORM语句中 默认所有的查询都是惰性查询"""
    # res = models.Book.objects.all()
    # res1 = models.Book.objects.filter(pk=1)
    """2.only与defer"""
    # 获取指定字段对应的数据 并且封装成字典
    # res = models.Book.objects.values('title')
    # for d in res:
    #     print(d,type(d))
    #     print(d.get('title'))
    # 获取指定字段对应的数据 并且封装成对象
    # res = models.Book.objects.only('title')
    # for obj in res:
        # print(obj.title)
        # print(obj.price)
        # print(obj.publish_time)
    """
    对象点击only括号内填写的字段名称不会再走数据库查询
    但是点击括号内不存在的字段名称则每次都会走数据库查询
    """
    # res = models.Book.objects.defer('title')
    # for obj in res:
    #     print(obj.price)
    """
    与only互为反操作
    """
    # res = models.Book.objects.filter(pk=3).first()
    # print(res.publish.name)
    """select_related括号内只能放外键字段 并且不支持多对多外键字段"""
    # res = models.Book.objects.select_related('publish')
    # for obj in res:
    #     print(obj.publish.name)
    """
    内部是连表操作 会将外键关联的表与当前表拼接 之后将所有的数据全部封装到数据对象中
    之后对象无论查询哪个表的数据都不再走数据库查询
    """
    res = models.Book.objects.prefetch_related('publish')
    for obj in res:
        print(obj.publish.name)
    """
    内部是子查询操作 先查询所有的书籍数据 之后查询每本书籍数据对应的出版社数据
    之后将总数据封装到数据对象中
    """
图书管理系统
表:四张表
功能:只需要实现图书的增删改查即可
界面:使用bootstrap框架
知识点:路由层 视图层 模板层 模型层全部

"""写项目的基本流程 永远都是从数据库设计开始"""


# 首页
url(r'^$', views.home,name='hm'),
# 图书展示
url(r'^book_list/', views.book_list, name='bl'),
# 图书添加
url(r'^book_add/', views.book_add, name='ba')


def home(request):
    return render(request, 'home.html')


def book_list(request):
    book_queryset = models.Book.objects.all()
    return render(request, 'book_list.html', locals())


def book_add(request):
    if request.method == 'POST':
        # 获取用户上传的图书数据
        title = request.POST.get('title')
        price = request.POST.get('price')
        publish_time = request.POST.get('publish_time')
        publish_pk = request.POST.get('publish_pk')
        authors_pk_list = request.POST.getlist('authors_pk_list')
        '''涉及到数据的校验 暂时都不考虑 后面有现成的组件可以完成'''
        book_obj = models.Book.objects.create(title=title, price=price, publish_time=publish_time, publish_id=publish_pk)
        book_obj.authors.add(*authors_pk_list)  # getlist获取到的是列表 而add方法只能传多个参数逗号隔开 所以使用*打散
        # _url = reverse('bl')
        return redirect('bl')
        """
        redirect括号内支持直接写别名 能够自动反向解析
            但是该功能也仅仅局限于没有无名有名分组的情况 就需要借助有reverse方法
        """
    publish_queryset = models.Publish.objects.all()
    author_queryset = models.Author.objects.all()
    return render(request, 'book_add.html', locals())
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786587.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号