1. 建表
1.1 常用字段
(1)AutoField(Field)
-int自增列,必须填入参数 primary_key=True
注:当model中如果没有自增列,则自动会创建一个列名为id的列
(2)IntegerField(Field)
- 整数列(有符号的) -2147483648 ~ 2147483647
(3)BooleanField(Field)
- 布尔值类型
NullBooleanField(Field):
- 可以为空的布尔值
(4) CharField(Field)
- 字符类型
- 必须提供max_length参数, max_length表示字符长度
(5)DateTimeField(DateField)
- 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
DateField(DateTimeCheckMixin, Field)
- 日期格式 YYYY-MM-DD
TimeField(DateTimeCheckMixin, Field)
- 时间格式 HH:MM[:ss[.uuuuuu]]
(6)FloatField(Field)
- 浮点型
(7)DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
1.2 参数
(1)null
如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.
(2)blank
如果为True,该字段允许不填。默认为False。
注:null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
(3)default 默认值
字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
(4)primary_key
如果为True,那么这个字段就是模型的主键
(5)unique
如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的
1.3 增删改查操作
注:可在Python脚本中调用Django环境
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day08.settings")
import django
django.setup()
from app01.models import *
---------------------------------------
单表模型:
class Book(models.Model):
name=models.CharField(max_length=32)
price=models.DecimalField(max_digits=5,decimal_places=2)
pub_date=models.DateField()
author=models.CharField(max_length=32)
publish=models.CharField(max_length=64)
def __str__(self):
return self.name
1.3.1 增
#第一种方式:
book=Book.objects .create(name='西游记',price='44',author='张三',publish='人民出版社')
# print(book) #西游记
#第二种方式
book=Book(name='python',price='13',author='ssx',publish='北京出版社')
book.save()
1.3.2 查
(1)filter包含了与所给筛选条件相匹配的对象
book=Book.objects .filter(name='python',nid=4)
print(book) #<QuerySet [<Book: python>]>
print(book.first().price) #或者book[0].nid
(2)all() 拿到所有的queryset对象
book=Book .objects .all()#<QuerySet [<Book: 西游记>, <Book: 西游记>, <Book: 三国>, <Book: python>, <Book: python>, <Book: python>, <Book: python>]>
print(book)
print(book.first()) #第一个book对象 西游记
(3)get 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误
book=Book.objects .get(name='三国')
print(book)
(4)values(括号指定获取的内容字段) 对应sql相当于select,返回一个特殊的QuerySet,运行后得到可迭代字典序列
book=Book.objects.all().values() #列表里包含每条数据的字典形式{'nid': 1, 'name': '西游记', 'price': Decimal('44.00'), 'author': '张三', 'publish': '人民出版社'}
book=Book.objects .all().values('name','price').last() #{'name': 'python', 'price': Decimal('13.00')}
book= Book.objects .all().values('name','price','nid').filter(name='西游记')
返回name是西游记的数据信息('name','price','nid')
print(book)
(5)exclude 除XX以外的
book=Book.objects .all().exclude(name='python') #<QuerySet [<Book: 西游记>, <Book: 西游记>, <Book: 三国>]>
print(book)
(6)or_der 默认从小到大排序 加- 为从大到小
book=Book.objects .order_by('price')
print(book)
(7) count 返回数据库中匹配查询(QuerySet)的对象数量
book=Book.objects .all().count()
print(Book.objects .all().last()) #python
(8)exists 判断queryset里有没有数据,没有就是false,有就是true
book=Book.objects .all().exists()
print(book )
(9)values_list 与values()相似,它返回的是一个元组序列
print(Book.objects.all().values_list('name','nid') )
< QuerySet[('西游记', 1), ('西游记', 2), ('三国', 3), ('python', 4), ('python', 5), ('python', 6), ('python', 7)] >
(10) distinct(): 从返回结果中剔除重复纪录
注:values(指定字段)
print(Book.objects .values('price').distinct())
无意义
ret = Book.objects.all().distinct()
print(ret)
(11)reverse() 对查询结果反向排序
books = Book.objects.all().order_by('-price').reverse()
相当于
books = Book.objects.all().order_by('price')
books = Book.objects.all().order_by('-price', 'pub_date').reverse()
相当于
books = Book.objects.all().order_by('price', '-pub_date')
print(books)
------------------------------------------
__模糊查询:
(1)以什么开头
res=Book.objects .all().filter(name__startswith='三')
(2)以什么结尾
ret=Book.objects .all().filter(name__endswith= '记')
(3)包含什么 对应到sql# like %python%
res=Book.objects.all().filter(name__contains= 'python')
print(res)
(4)icontains 不区分大小写
print(Book.objects .filter(name__icontains= 'PYTHON'))
(5)gt大于,lt小于 (lte小于等于, gte大于等于) range指定范围
print(Book.objects .filter(price__gt='13')) #价格大于15
print(Book.objects .filter(price__lt='15')) #小于
print(Book.objects .filter(price__range=[15,100])) #价格15至100的书籍
等同于Book .objects .filter(price__gte=15,price__lte=100)
< QuerySet[ < Book: 西游记 >, < Book: 西游记 >, < Book: 三国 >] >
(6)查询id 后面列表的数据
print(Book.objects.filter(nid__in=[1,2,44]))
print(Book .objects.filter(nid__range=[1,6]))
(7)通过日期查询
print(Book.objects.filter(pub_date__year=2018))
ret = Book.objects.filter(pub_date__year__gt=2017) #17年之后的
print(Book.objects.filter(pub_date__month__gt=3)) #大于3月份
Book.objects.filter(pub_date__day__in=[18,7]) #18或者7号
Book.objects.filter(pub_date__month=1)
1.3.3 删除
(1)queryset对象可以调用
print(Book.objects .filter(name='西游记').delete())
(2, {'app01.Book': 2}) 影响两条记录,哪个表的记录,影响这个表的两条记录
(2)删除表所有信息,通过queryset对象调delete()
ret=Book.objects.all().delete() #可以删除
print(Book .objects.delete()) #无法删除
1.3.4 更新
例:
将价格为13 的书的名字改为PYTHON
res=Book .objects.all().filter(price=13).update(name='PYTHON')
print(res) # 4
返回结果是int类型,只能是queryset对象来调,对象不能调
注:对象不能调
res=Book.objects.all().filter(price=13).first().update(name="ggg")
print(res)
报错AttributeError: 'Book'object has no attribute'update'
指定id 改日期
res= Book.objects.all().filter(nid=8).update(pub_date='1988-5-12')
print(res)