昨日内容回顾
模型层
单表操作
1.增
user_obj = models.User.objects.create()
user_obj = models.User()
user_obj.save()
2.改
models.User.objects.filter().update()
user_obj = models.User.objects.filter().first()
user_obj.username = ‘jason‘
user_obj.save()
3.查
models.User.objects.filter()
models.User.objects.all()
models.User.objects.get()
4.删
models.User.objects.filter().delete()
user_obj = models.User.objects.filter().first()
user_obj.delete()
13条查询方法
all()
filter()
get()
values() # 列表套字典
values_list() # 列表套元组
first()
last()
count()
exclude()
distinct()
order_by()
exists()
reverse()
神奇的双下划綫查询
价格大于 小于 大于等于 小于等于 在什么之间 或好几个选择
price__gt
price__lt
price__gte
price__lte
price__in
price__range
书籍名称中包含
title__contains=‘p‘
title__icontains=‘p‘
创建的年份
create_time__year
多表操作
外键字段的增删改查
一对多
publish_id = 1
publish = publish_obj
多对多
add()
set()
remove()
# 上面三个都支持 传数字或者是对象 并且都可以传多个
# 但是set必须接受一个可迭代对象
clear()
# 不需要传参数 直接清空所有关系
跨表查询
规律:只要是queryset对象 就可以无限制的点queryset的方法!!!
正方向概念
正向:关联字段在当前表中
反向:关联字段不再当前表
结论:正向查询按字段,反向查询按表名小写
"""
不要一次性把orm写完,写一点看一点
"""
# 基于对象的跨表查询(子查询)
# 一次只拿一个对象 然后利用对象点的操作 完成数据的查询
# 正向
book_obj.publish.name
book_obj.authors # App01.Author.None
book_obj.authors.all()
author_obj.author_detail.phone
# 反向
"""反向表名小写什么时候需要加_set(当获取的是多个对象的饿时候)"""
publish_obj.book_set # App01.Book.None
publish_obj.book_set.all()
author_obj.book_set # App01.Book.None
author_obj.book_set.all()
author_detail_obj.author.name
# 基于双下划綫的跨表查询(连表查询)
models.Book.objects.filter().values(‘publish__name‘)
models.Publish.objects.filter(book__title=‘三‘).values(‘name‘)
models.Book.objects.filter().values(‘authors__author_detail__phone‘)
# 只要表中有外键字段 你可以通过__无限制的跨表
F与Q
F查询
从数据库中获取字段对应的数据
库存数大于卖出数
Q查询
与
filter(Q(),Q())
filter(Q()&Q())
或
filter(Q()|Q())
非
filter(~Q())
补充
q = Q()
q.connector = ‘or‘
q.children.append((‘title‘,‘三‘))
q.children.append((‘price‘,666))
models.Book.objects.filter(q)
内容复习
Django ORM 常用字段和参数
常用字段
AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
CharField(在mysql中是 varchar类型 且django中没有 char字段 需要自己定义)
字符类型,必须提供max_length参数, max_length表示字符长度。
在django中如何定字段? 技巧:大部分设计到数据库的 模块都是 django.db import models(****)
DateField 和 DateTimeField 以及他们的参数
auto_now_add ----添加一次
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now --- 修改就改
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
字段参数
null 例子: null=Ture
用于表示某个字段可以为空。
unique 例子 unique = True 其他知识点:外键字段的一对一 可以不用Foreignkey直接就是 unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。
其他需要了解的字段
from django.db import models
# Create your models here.
#Django中没有对应的char类型字段,但是我们可以自己创建
class FixCharField(models.Field):
‘‘‘
自定义的char类型的字段类
‘‘‘
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):
‘‘‘
限定生成的数据库表字段类型char,长度为max_length指定的值
:param connection:
:return:
‘‘‘
return ‘char(%s)‘%self.max_length
#应用上面自定义的char类型
class Class(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
class_name=FixCharField(max_length=16)
gender_choice=((1,‘男‘),(2,‘女‘),(3,‘保密‘))
gender=models.SmallIntegerField(choices=gender_choice,default=3)
自定义及使用
了解字段
关系字段以及他的参数
ForeignKey
字段参数
to
设置要关联的表
to_field
设置要关联的表的字段
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
删除关联数据,与之关联也删除
db_constraint
是否在数据库中创建外键约束,默认为True。
外键字段 当你在使用django2.X版本的时候 在建立外键关系时(*****) 需要你手动添加几个关键点参数 models.cascade db_constraints
数据库查询优化 only与defer select_releated与prefect_releated
orm内所有的语句操作 都是惰性查询:只会在你真正需要数据的时候才会走数据库,如果你单单只写orm语句时不会走数据库的 这样设计的好处 在于 减轻数据库的压力
查看更多关于☆Django☆---orm 字段 数据库查询优化 事务的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did171427