• models的单表操作


    orm创建数据库

    from django.db import models
    
    # Create your models here.
    
    
    class Book(models.Model):
        name = models.CharField(max_length = 30)
        price = models.DecimalField(max_digits=30,decimal_places=3)
        date = models.DateTimeField()
        publish = models.ForeignKey(to="Publish",to_field='id',on_delete = models.CASCADE)
        authors = models.ManyToManyField(to='Author')
    
    
    
    class Publish(models.Model):
        title = models.CharField(max_length = 30)
        addr = models.IntegerField()
    
    class Author(models.Model):
        name = models.CharField(max_length = 30)
        addr = models.CharField(max_length = 30)
        gf = models.OneToOneField(to='Gfriend',to_field='id',on_delete=models.CASCADE)
    
    class Gfriend(models.Model):
        name = models.CharField(max_length =30)
        age = models.IntegerField()
    orm创建数据库

    既然数据库已经建立完成那么 我们就可以对这个数据库进行操作了

     

    先导入你新建立的models中的你建立的数据库表的名字

    from one.models import Book
    
    从新建立的app one中导入我建立的数据库的Book表

    增加:

    
    

    book_obj = Book (...)
    book_obj.save()



    第一种: book_obj
    = Book(name = '肉蒲团', price=30.6, publish ='老王出版社') book_obj.save() 这个当你为Book表添加完内容后必须要执行save 不然你的内容无法添加

    第二种是直接添加的  比较简便;

    添加记录的方式2:create返回记录对象

     book_obj =  Book.objects.create(name = '金瓶', price = 47.67, publish = '老刘头出版社')
    
    就是直接调用object基类 然后create创建 即可

    一般推荐第二种

    也可以直接插入多条数据:

    obj = Book.objects.create(name = 'python1',price=666,publish = '全栈出版社')
    obj = Book.objects.create(name = 'Python',price = 888,publish = '人工智能出版社')
    obj = Book.objects.create(name = 'python',price=999,publish = '数据分析')

    查询表纪录:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <1all():                  查询所有结果
      
    <2filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
      
    <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                                如果符合筛选条件的对象超过一个或者没有都会抛出错误。
      
    <4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
     
    <5> order_by(*field):       对查询结果排序
      
    <6> reverse():              对查询结果反向排序
      
    <8> count():                返回数据库中匹配查询(QuerySet)的对象数量。
      
    <9> first():                返回第一条记录
      
    <10> last():                返回最后一条记录
      
    <11> exists():              如果QuerySet包含数据,就返回True,否则返回False
     
    <12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                                model的实例化对象,而是一个可迭代的字典序列
    <13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
     
    <14> distinct():            从返回结果中剔除重复纪录

    对应的演示:

    每一次在你的数据库中插入一条数据就在你的queryset中建立一个对象obj

    1、 all()
    s = Book.objects.all()  这样得到的是一个queryset这种特殊类型
    # 返回的是一个queryset数据类型对象,类似于 [obj,obj,.....]
    因为内部都是存储的都是对象那么取值可以用for
    s = Book.objects.all()
    for obj in s:
        print(obj.name)

    2、   filter     返回的是一个queryset数据类型对象,[model_obj,.....]
    其实filter就好比筛选的意思 它只能设置为等于来查找

    s = Book.objects.filter(name = '金瓶')
    # print(s)    # 得到<QuerySet [<Book: Book object (3)>]>
    for obj in s:  #因为得到的是queryset你循环这个可迭代对象就取到里面的值就可以得到你想要的值了
        print(obj.name)

    3 、last first 根据切片来查找

    last求最后一个 first求最后一个

    obj = Book.objects.all().first()
    # print(obj)   #Book object (1)
    print(obj.name)
    
    obj = Book.objects.all().last()
    print(obj.name)

    4、get 方法返回的就是一个modle对象 (有且只有一个 结果的时候才有意义 也就是只能查找为1的时候的结果)

     

    obj = Book .objects.get(id = 3)
    print(obj.name)

    5、
    exclude 排除的意思 和filter的差不多 filter是求出里面的条件 exclude是排除里面的值 并且都是得到queryset的类型

    obj = Book.objects.exclude(name = '肉蒲团')  #得到的也是queryset所以也要用for来求取值
    for i in obj:
        print(i.name)

    • models.n.objcts.all().order_by("id") # 从小带大排序

    • models.n.objects.all().order_by("-id") #带减号的就是desc从大到小排序

    • models.n.objects.all().order_by("id","-age") # 先按照id排序 然后相同的id再按照age排序

    6、order_by() 排序 默认熊小到大排序
    默认从小到大:  也可以加减号  然后从大到小排序

    ret = Book.objects.all().order_by('price')  #这个是求出所有并且按照价格来来排序
    for i in ret:
        print(i.name)

    • models.n.objcts.all().order_by("id") # 从小带大排序

    • models.n.objects.all().order_by("-id") #带减号的就是desc从大到小排序

    • models.n.objects.all().order_by("id","-age") # 先按照id排序 然后相同的id再按照age排序

    从大到小用reverse()

    ret = Book.objects.all().order_by('price').reverse()  #把你的得到的结果翻转 就是按照从大到小的结果来排序
    for i in ret:
        print(i.name)

     

    7、
    count 查找总数量

    ret = Book.objects.all().count()  # 查找总数量  
    print(ret)

     

    8、exists查找是否有在里面 返回的是True 或者False

    ret = Book.objects.all().filter(price = 30.60).exists()   
    if ret:
        print('help me')
    else:
        print('nothing')

    9、values () 把你想要得到的内容放置在一个列表嵌套字典中 字典的键就是你想要得到的内容

    obj = Book.objects.all().values('name')  # <QuerySet [{'name': '肉蒲团'}, {'name': '肉蒲团'}, {'name': '金瓶'}]>
    print(obj)

     values一般用于你要取这个表的指定的这个字段 比如你要对这个表中的name这个列进行对比 ,那么就用values先取出这个列再进行对比

     

    10、values_list() 和values用法一样只不过得到的内容不同 这个得到的是列表嵌套元组

     

    obj = Book.objects.all().values_list('name','price')
    print(obj) #<QuerySet [('肉蒲团', Decimal('30.60')), ('肉蒲团', Decimal('30.60')), ('金瓶', Decimal('47.67'))]>

     

     

    11、
    distinct() 去重 根据你的条件去重 必须都满足

    obj = Book.objects.all().values('name').distinct()
    print(obj)

    12、也可以直接指定下标来选择[ 下标]

    obj = Book.objects.all().[3]
    
    选择下标为3的对象

    obj = Book.objects.all().[3,7]
    这个是取到3-7的对象
     

    上面的都是精准匹配就是必须使用==才能匹配到 下面我们学习模糊匹配:

    模糊匹配:

    模糊匹配都会在前面加双下划线__

    大于:__gt:

     book_list = Book.objects.filter(price__gt = 10)  #大于__gt   匹配价格大于10 的物品
        for i in book_list:
            print(i.name)

    小于: __lt

    obj = Book.objects.all().filter(price__lt = 35) #查找价格小于35的物品的名称
        for i in obj:
            print(i.name)

    大于等于:__gte

     obj = Book.objects.all().filter(price__gte = 20)   # 查找价格大于等于20的物品
        for i in obj:
            print(i.name)

    小于等于:__lte

    obj = Book.objects.all().filter(price__lte = 50) # 查找价格小于50的物品
        for i in obj:
            print(i.name)

    范围:__range = [ ...]

    range 可以等于[]也可以等于()

    obj = Book.objects.all().filter(price__range = [10,100])
        for i in obj:
            print(i.name)

    以...开头 __startswith

    obj = Book.objects.all().filter(name__startswith = '' )  查找名字是以金开头的物品
        for i in obj:
            print(i.name)

    以...结尾:__endswiths:

    obj = Book.objects.all().filter(name__endswith = '') # 查找名字是以团结尾的物品
        for i in obj:
            print(i.name)

    包含:__contains='包含内容' 这个是区分大小写  你规定大写就只能查到大写的  你规定小写的只能查到小写的

    obj = Book.objects.all().filter(name__contains = '')  #查找名字包含梅的名字
        for i in obj:
            print(i.name)


    obj1 = Book.objects.all().filter(name__contains = 'python')
    for i in obj1:
    print(i.name)

    查找只含有小写的python的name

    不区分大小写的查找__icontains = ''

     obj = Book.objects.all().filter(name__icontains='Python')
        for i in obj:
            print(i.name)
    这个是查找所有的含有python的name不区分大小写

    Book.objects.filter(pub_date__year=2012) 过滤年份

    Book.objects.filter(pub_date__year=2012)
    过滤你的pub_date的年份是2012的

    修改表纪录:

    根据你的查询内容修改只需要在你的查询条件后面加上update(修改内容)即可

    Book.objects.filter(price__lte = 35).update(price=32)
    这个是把你的价格小于35的全部改为32

    删除表记录:

    Book.objects.filter(price__lte = 35).delete()
    删除价格小于35的物品
    查询练习:

    1 查询老男孩出版社出版过的价格大于200的书籍
    2 查询2017年8月出版的所有以py开头的书籍名称
    3 查询价格为50,100或者150的所有书籍名称及其出版社名称
    4 查询价格在100到200之间的所有书籍名称及其价格
    5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
    6 查询价格大于200的书籍的个数
    7 查询价格不等于100的所有书籍
    8 查询苹果出版社出版的书籍中的第3-7本(前提存在足够数量的书籍)
  • 相关阅读:
    tomcat启动startup.bat一闪而过
    shell简介
    hbase总结,值得一看
    hive的 安装和配置
    存储器管理
    银行家算法
    洛谷 2590 树的统计
    树链剖分 洛谷 3384
    2.3最大公约数与最小公倍数
    2.2 素数与合数
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/9236325.html
Copyright © 2020-2023  润新知