模型层之单表操作

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)
posted @ 2019-07-21 08:08  朝朝哥  阅读(174)  评论(0编辑  收藏  举报