zoukankan      html  css  js  c++  java
  • django框架基础ORM单表操作长期维护

      ###############    单表操作-添加数据    ################

    import os
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM.settings")
        import django
        django.setup()
    
        from app01 import models
    
        # 一、添加表记录
        # 对于单表有两种方式
        # 添加数据的两种方式
        # 方式一:实例化对象就是一条表记录
        obj = models.Publish(name="上地出版社", city="北京", email="1919@qq.com")
        obj.save()
        # 方式二:
        models.Publish.objects.create(name="朝阳出版社", city="北京", email="1919@qq.com")

    ###############    单表操作-查询数据-必会的13条    ################

    """
    返回QuerySet对象的方法有
    all() filter() exclude() order_by() reverse() distinct()
    
    特殊的QuerySet
    values()       返回一个可迭代的字典序列
    values_list() 返回一个可迭代的元祖序列
    
    返回具体对象的 get() first() last() 返回布尔值的方法有: exists() 返回数字的方法有 count()
    """

    实例:

    import os
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM.settings")
        import django
        django.setup()
        from app01 import models
    
        # ORM一般操作,必知必会13条:
        # 返回queryset对象的:
        # 8个,all filter values values_list exclude order_by reverse distinct
        all_book = models.Book.objects.all()  # 返回所有数据,结果是可以遍历的
        book1 = models.Book.objects.filter(id=1)  # 返回满足条件的数据
        book2 = models.Book.objects.values()  # 这是把所有字段拿出来了,这是一个字典序列,values('name','create_time')  #可以指定字段,
        book3 = models.Book.objects.values_list()  # values_list('name','create_time') #这是返回的一个元组,
        book4 = models.Book.objects.exclude(id=1)  # 返回不满足条件的数据
        # book5 = models.Book.objects.order_by('id')  # 对结果排序,升序
        # book5 = models.Book.objects.order_by('-id')  # 对结果排序,降序,在字段前面加减号,
        book5 = models.Book.objects.filter(id__lt=3).order_by('-id')  # 对过滤结果进行排序
        book6 = models.Book.objects.reverse()
        book7 = models.Book.objects.distinct()
        # 返回具体对象的:
        # 3个,get first last
        book8 = models.Book.objects.get(id=1)  # 查不到数据会报异常,所以一般不用这个,返回的结果中有且只有一条数据,有多条数据,也会报异常
        book9 = models.Book.objects.first()
        book10 = models.Book.objects.last()
        # 返回布尔类型
        # 1个,exists
        book11 = models.Book.objects.exists()  # 判断查询集里面有没有数据,如果有就是True,没有就是False,括号里面不需要有值
        # 返回数量
        # 1个,count
        book12 = models.Book.objects.count()
    
        print(book12)

    ###############    单表操作-双下划线   ################

    import os
    from datetime import date
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM.settings")
        import django
        django.setup()
        from app01 import models
    
        # 模糊查询:
        book1 = models.Book.objects.filter(title__contains='')  # 包含红的,
        book2 = models.Book.objects.filter(title__endswith='')  # 以志结尾的,
        book3 = models.Book.objects.filter(title__startswith='西')  # 以西开头的
    
        # 查询书名不为空的书
        book4 = models.Book.objects.filter(title__isnull=False)
    
        # 范围查询
        book5 = models.Book.objects.filter(id__in=[2, 3])
    
        # 比较查询
        book6 = models.Book.objects.filter(id__gt=3)  # id大于3,great
        book7 = models.Book.objects.filter(id__lt=3)  # id小于3 less
        book8 = models.Book.objects.filter(id__gte=3)  # id大于等于3 equal
        book9 = models.Book.objects.filter(id__lte=3)  # id小于等于3 equal
    
        # 日期查询
        # 查询1980年出版的图书
        book10 = models.Book.objects.filter(pub_data__year=1980)
        # 查询1980年1月1日后发布的图书
        book11 = models.Book.objects.filter(pub_data__gt=date(1981, 1, 1))

     ###############    django -修改数据    ################

    import os
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM.settings")
        import django
        django.setup()
        from app01 import models
    
        # 第一种方式
        publish = models.Publish.objects.get(nid=1)  # get返回一个具体的对象
        publish.name = "tenlen"
        publish.save()
    
        # 第二种方式
        models.Publish.objects.filter(nid=2).update(name="xxx")  # 不能使用get(id =5) filter返回一个queryset对象
    
        ret = models.Publish.objects.all()
        print(ret)
    
    """
    修改表记录
    注意:
    <1> 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,
    而filter返回的是一个QuerySet对象(filter里面的条件可能有多个条件符合,比如name='alvin',可能有两个name='alvin'的行数据)。
    <2>在“插入和更新数据”小节中,我们有提到模型的save()方法,这个方法会更新一行里的所有列。 
    而某些情况下,我们只需要更新行里的某几列。
    此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,
    表示受影响的记录条数。
    注意,这里因为update返回的是一个整形,所以没法用query属性;对于每次创建一个对象,想显示对应的raw sql,
    需要在settings加上日志记录部分
    
    """

      ###############    ORM-删除数据    ################

    import os
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM.settings")
        import django
        django.setup()
        from app01 import models
    
        models.Publish.objects.filter(nid=id).delete()
    
        b =models.Publish.objects.get(pk=1)
        b.delete()
    
    
    """
    删除表记录
    删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:e.delete()
    你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。
    例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:
    Entry.objects.filter(pub_date__year=2005).delete()
    
    要牢记这一点:无论在什么情况下,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,
    而并不是分别删除每个对象。如果你想使用在 model 中自定义的 delete() 方法,就要自行调用每个对象的delete 方法。
    (例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。
    
    在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。
    例如:
    b = Blog.objects.get(pk=1)
    b.delete()
    要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。
    这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。
    如果你确认要删除所有的对象,那么你必须显式地调用:
    Entry.objects.all().delete()
    
    """

    ###############    django -ORM单表查询函数    ################

    ###############    django -ORM单表查询函数    ################

  • 相关阅读:
    muduo源代码分析--Reactor在模型muduo使用(两)
    uinty3d导入错误问题解决
    道量化交易程序猿(25)--Cointrader之MarketData市场数据实体(12)
    CSS cursor 属性
    手动挖第一桶金,10日赚3十万元
    JavaScript取出字符串和尾随空格
    编程的子阵列和最大和膨胀的美(可连接的端到端)
    OpenCV图像的基础叠加
    [SCSS] Organize SCSS into Multiple Files with Partials
    [CSS Flex] Justify-content
  • 原文地址:https://www.cnblogs.com/andy0816/p/12320250.html
Copyright © 2011-2022 走看看