zoukankan      html  css  js  c++  java
  • 模型层之单表操作

    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)
    
  • 相关阅读:
    Python-操作符与基本数据类型
    初识Python
    HDU 1166 敌兵布阵(线段树求sum)
    HDU 1754 I Hate It(线段树求max)
    HDU 1176 免费馅饼
    HDU 1466 计算直线的交点数
    HDU 1506 Largest Rectangle in a Histogram(最大矩形面积)
    AYOJ 单词接龙(搜索)
    AYOJ 传球游戏(递推)
    AYOJ 方格取数(多进程DP)
  • 原文地址:https://www.cnblogs.com/quqinchao/p/11220130.html
Copyright © 2011-2022 走看看