• Django-ORM增删改查


    ORM对单表进行增删改查

    一,增加记录

    1 #第一种方式
    2 b=Book(name="Linux",price=66,author="kelvin",pub_date="2018-12-28")
    3 b.save()
    4 
    5 #第二种方式
    6 Book.object.create(name="Linux",price=66,author="kelvin",pub_date="2018-12-28")

    批量增加
    models.Student.objects.bulk_create(objs_list)

    有就更新,没有就创建
    models.Student.objects.update_or_create(
      name='kelvin',
      defaults={
      'age':38,
      }
    )

     二,修改记录

    1 #第一种方式
    2 Book.object.filter(id=1),update(pub_date="2019-03-01")
    3 
    4 #第二种方式
    5 b=Book.object.get(id=1) #get() 只取出一个对象
    6 b.price=888
    7 b.save()

     注意:在选择对应使用方法时,最好不适用save() 的这种方式,因为save() 方法会把记录的所有字段数据进行修改,即使该字段没有改变也会重新更新数据。

    三,删除记录

    1 Book.objects.filter(id=1).delete() #筛选指定记录,调用delete()方法

     四,查询记录

     1 #查询Book表中的所有记录
     2 Book.objects.all()
     3 
     4 
     5 #查询Book表中的指定记录(切片操作)
     6 Book.objects.all()[1:3:2]  #[起始位置:终止位置:步长]
     7 
     8 
     9 #查询Book表中的第一条记录
    10 Book.objects.first()
    11 
    12 
    13 #查询Book表中的最后一条记录
    14 Book.objects.last()
    15 
    16 
    17 #查询之get方法
    18 Book.objects.get(id=2)  #get(筛选条件)
    19 #注意:get()方法取到的是一个具体的对象记录,如果记录为空或记录多于一条就报错
    20 
    21 
    22 #查询filter方法
    23 Book.objects.filter(id=2)  #filter(筛选条件)
    24 #注意:filter() 查询结果均为QuerySet集合,即使集合中就一条数据
    25 
    26 
    27 #查询Book表中记录的指定字段
    28 ret=Book.objects.filter(price>20).values("name","price")
    29 #结果:<QuerySet[{"name":"python","price":50},{"name":"Linux","price":88}]>
    30 
    31 ret=Book.objects.filter(price>20).values_list("name","price")
    32 #结果:<QuerySet[("python",50),("Linux",88)]>
    33 
    34 
    35 #查询Book表中记录的指定字段外的记录
    36 ret=Book.objects.exclude(price>20).values("name","price")
    37 
    38 ret=Book.objects.exclude(price>20).values_list("name","price")
    39 
    40 #查询结果去重
    41 ret=Book.objects.filter(price>20).values("name").distinct()
    42 
    43 #查询结果数量统计
    44 ret=Book.objects.filter(price>20).values("name").count()

     查询相关的api:

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

    惰性机制:

    所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。

    如果想要服务器控制台输出查询对应的sql语句可以在setting中加入:

     1 LOGGING = {
     2     'version': 1,
     3     'disable_existing_loggers': False,
     4     'handlers': {
     5         'console':{
     6             'level':'DEBUG',
     7             'class':'logging.StreamHandler',
     8         },
     9     },
    10     'loggers': {
    11         'django.db.backends': {
    12             'handlers': ['console'],
    13             'propagate': True,
    14             'level':'DEBUG',
    15         },
    16     }
    17 }
    18 
    19 LOGGING

    四,模糊查询

     1 #    models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
     2 #
     3 #    models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
     4 #    models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
     5 #
     6 #    models.Tb1.objects.filter(name__contains="ven")
     7 #    models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
     8 #
     9 #    models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
    10 #
    11 #    startswith,istartswith, endswith, iendswith,

     ORM对多表进行增删改查(一对多)

    一:增加记录

    1 #第一种方式
    2 Book.objects.create(name="python",price=45,time="2015-12-03",publish_id=2)
    3 
    4 #第二种方式
    5 publish_obj=Publish.objects.filter(name="人民出版社")[0]
    6 Book.objects.create(name="python",price=45,time="2015-12-03",publish=publish_obj)

    二:查询记录

     1 #第一种:通过对象(查询人民出版社出版的书籍)
     2 #正向查询
     3 publish_obj=Publish.objects.filter(name="人民出版社")[0]
     4 res=Book.objects.filter(publish=publish_obj).values("name","price")
     5 
     6 #反向查询(根据出版社找所有该出版社出版的书籍)
     7 publish_obj=Publish.objects.filter(name="人民出版社")[0]
     8 res=publish_obj.book_set.all().values("name","price")
     9 
    10 #第二种:万能的双下划綫(查询人民出版社出版过的书籍)
    11 #正向查询
    12 res=Book.objects.filter(public__name="人民出版社").values("name")
    13 #反向查询
    14 res=Publish.objects.filter(name="人民出版社").values("book__name")

     

  • 相关阅读:
    递归与分治4
    递归与分治3
    递归与分治2
    递归与分治1
    枚举与递推3
    枚举与递推2
    求编译器中数的最值(c++)
    移动小球链表实现
    阶乘的精确值
    while((c = getchar()) != EOF)(键盘输入问题)
  • 原文地址:https://www.cnblogs.com/sun-10387834/p/10540896.html
Copyright © 2020-2023  润新知