模型层之单表操作

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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zggzxx.html