字段属性 | 含义 |
---|---|
max_length | 最大长度 |
verbose_name | 备注,站点管理中用于显示字段为中文 |
max_digits | 浮点型最大长度 |
decimal_places | 小数点位数 |
auto_now = True | 获取的是当前时间 |
null = True | 可为空,默认是不为空 |
primary_key=True | 主键 |
字段类型 | 含义 |
---|---|
CharField | varchar类型,需要指定长度 |
IntegerField | 整形 |
DecimalField | 浮点型 需要指定最大长度和小数点位数 |
DateField | 日期 |
datetime | 日期时间 |
AutoField | 自增 |
ForeignKey | 做外键 |
字段名和字段用法的一些举例:
# id = models.AutoField(primary_key=True)
# django ORM会自动帮我们创建一个主键
name = models.CharField(max_length=32,verbose_name="姓名")
age = models.IntegerField(verbose_name="年龄")
height = models.DecimalField(max_digits=5,decimal_places=2,verbose_name="身高",null=True)
birthday = models.DateField(verbose_name="生日",auto_now=True)
publish = models.ForeignKey(to=Publish,to_field='id',on_delete=models.CASCADE)
外键括号里面一般写的内容
相关内容 | 含义 |
---|---|
to | 设置关联表 |
to_field | 关联表要关联的键名,默认为关联表中的id,可以不写 |
on_delete | 当删除关联表中的数据的时候,从表做什么行为, |
on_delete 后面一般接的方法:
方法 | 作用 |
---|---|
CASCADE | 当关联表中数据删除的时候,外键所在表中的数据也会被删除 |
SET_NULL | 当关联表中数据删除的时候,外键所在表中的外键设置为空 |
SET_DEFAULT(1) | 当关联表中数据删除的时候,外键所在表中的外键设置一个默认值,默认值为1 |
PROTECT | 关联保护,当关联表的数据被删除的时候,报异常, |
DO_NOTHING | 当关联表中数据删除的时候,外键所在的表不做任何事情 |
元数据 | 含义 |
---|---|
db_table | 修改表的名字(原表中修改名字显示格式为appname_类名,而元数据修改后名字即为修改后的名字) |
verbose_name | 备注,站点管理中用于显示模型名字为中文,会出现s |
verbose_name_plural | 显示复数名称,verbose_name_plural=‘用户’ 可以直接将用户好后面的s去掉 |
ordering= [’-age’] | 指定排序 |
相关代码如下:
class Meta:
db_table = 'person'
verbose_name = "用户"
verbose_name_plural = verbose_name
# ordering= ['-age','id','name'] #指定以年龄降序,id升序,名字升序排序
单表操作之前的基础构造
在操作之前,先创建好类模型,并进行数据迁移;
写好视图和路由;
① 增加
② 查询
1. all()
# all 方法
date = Person.objects.all()
# print (date)
# print (date[0].name)
# print (date[0].age)
# print (date[0].height)
for one in date:
print (one.height)
print (one.name)
2.get方法
返回是一个 对象
返回结果有且只有一条,get后面的条件常用主键
# get 方法
data = Person.objects.get(id=1)
print (data.name)
print (data.age)
3.filter 方法,类似于sql中的 where
# filter 方法
data = Person.objects.filter(name="zhangsan")
print (data)
first方法 和last 方法
first 返回一个对象,返回符合条件的第一条数据(对象)
last 返回一个对象,返回符合条件的最后一条数据(对象)
data = Person.objects.filter(name="zhangsan").first()
print (data.age)
data = Person.objects.filter(name="zhangsan").last()
print(data.age)
4.order by
# 升序
# data = Person.objects.all().order_by("age")
# 降序
data = Person.objects.all().order_by("-age")
for one in data:
print (one.age)
data = Person.objects.all().order_by("age","-name")
5.exclude()
返回一个quertset,查询集,包含了跟给定条件不符合的所有数据
data = Person.objects.exclude(name="zhangsan")
for one in data:
print (one.name)
6.一些用在条件后的方法
values 返回的是一个queryset 内容不是实例对象,而是具体数据的字典
# values queryset [对象,对象,对象]
# 返回的是一个queryset 内容不是实例对象,而是具体数据的字典
# data = Person.objects.filter(name="zhangsan").values()
# print (data)
# count 返回的是符合当前条件的数据的条数
# data = Person.objects.filter(name="zhangsan").count()
# print (data)
exists 返回一个 True或者Flase 判断是否存在
# data = Person.objects.filter(name="libai").exists()
# print (data)
切片 通过排序来去范围内的数,[2:5] 2是索引,查出来的是第三个开始第五个结束
data = Person.objects.order_by("id")[2:5]
print (data)
③ 修改
save
注意:拿到的结果是对象还是查询集合
步骤:
先查询到数据,然后进行重新赋值,然后执行save 进行保存
# data = Person.objects.get(id=2)
# data.name = "python"
# data.save()
# data = Person.objects.filter(name="wangwu").all()
# for one in data:
# if one.id == 4:
# one.age=21
# else:
# one.age = 23
# one.save()
update
Person.objects.filter(id=2).update(name="java")
④ 删除
# delete方法
Person.objects.filter(id=7).delete()
⑤ 双下划线查询
# __lt 小于
# data = Person.objects.filter(id__lt=3)
# print (data)
# gt 大于
# data = Person.objects.filter(id__gt=3)
# print (data)
# gte 大于等于
# data = Person.objects.filter(id__gte=3)
# print (data)
# in 包含 select * from stu where id in (1,2,3,4);
# data = Person.objects.filter(id__in = [1,2,3])
# print (data)
# exclude 不包含
# range 范围
# data = Person.objects.filter(id__range = [1,5])
# print (data)
# startswith 像 like j% endswith 像 %j
# data = Person.objects.filter(name__startswith="j")
# print (data)
# endswith
# __contains 包含 大小写敏感
data = Person.objects.filter(name__contains="w")
print (data)
# __icontains 包含,大小写不敏感
data = Person.objects.filter(name__icontains="w")
print(data)
双下划线方法 | 含义 |
---|---|
__lt | 小于 |
__gt | 大于 |
__gte | 大于等于 |
__in | 包含 |
__exclude | 不包含 |
__range | 范围 |
__startswith | 像 like j% 以什么开头 |
__endswith | 像 %j 以什么结束 |
__contains | 包含 大小写敏感 区分大小写 |
__icontains | 包含,大小写不敏感 不区分大小写 |
查询集,不是python列表,也叫结果集,表示从数据库中获取的一个对象集合
增加出版社
Publish.objects.create(name='清华出版社',address='北京')
publish = Publish(name='中国出版社',address='北京朝阳')
publish.save()
publish=Publish()
publish.name='河南出版社'
publish.address='河南'
publish.save()
Book.objects.create(name=‘python入门’,publish_id=‘1’)
publish=Publish.objects.get(name='中国出版社')
Book.objects.create(name='python基础',publish_id=publish.id)
# Book.objects.create(name='python核心编程',publish = Publish.objects.get(name='中国出版社'))
# 正向操作 从外键所在的表到主表叫正向
book = Book()
book.name= '笨办法学python'
book.publish = Publish.objects.get(name='河南出版社')
book.save()
# 反向操作 从主表到从表 叫反向
publish_obj = Publish.objects.get(name="中国出版社")
publish_obj.book_set.create(name='pythonWeb开发')
正向操作和反向操作:
正向操作 从外键所在的表到主表叫正向
反向操作 从主表到从表 叫反向
查询的第一种方法
# publish = Publish.objects.get(name="中国出版社")
# book = Book.objects.filter(publish_id=publish.id).all()
# for x in book:
# print (x.name)
# 正向查询 从外键所在的表到主表叫正向
# 查询 pythonWeb开发 属于哪一个出版社
# book = Book.objects.filter(name='pythonWeb开发').first()
# print (book.name)
# print (book.publish.name)
# 反向查询 从主表到从表 叫 反向查询 _set
publish = Publish.objects.get(name='中国出版社')
book = publish.book_set.all()
print (book)
① save
book = Book.objects.filter(name='python入门',id=2).first()
book=Book.objects.get(id=2)
book.publish=Publish.objects.get(name='中国出版社')
book.save()
② update
Book.objects.filter(name="python基础",id=3).update(publish_id=Publish.objects.get(name='河南出版社'))
③ set 反向
publish=Publish.objects.get(name='河南出版社')
book=Book.objects.get(id=6)
publish.book_set.set([book])
先删除外键所在的表,在删除关联表
Book.objects.get(id=2).delete()
Publish.objects.get(name='清华出版社').delete()