• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共43篇

    python3.X - Web - Django3.2.9

关闭

返回栏目

关闭

返回python3.X - Web - Django3.2.9栏目

23 - 表模型 - django.db.models -

作者:

贺及楼

成为作者

更新日期:2024-04-06 11:37:12

django查

简便写法

  1. req = json.loads(request.body)
  2. start_time = req.get("start_time")
  3. end_time = req.get("end_time")
  4. email = req.get("email")
  5. display_name = req.get("display_name")
  6. record_obj = record_table.objects
  7. if start_time:
  8. record_obj = record_obj.filter(record_time__gte=start_time)
  9. if end_time:
  10. record_obj = record_obj.filter(record_time__lte=end_time)
  11. if email:
  12. record_obj = record_obj.filter(email__icontains=email)
  13. if display_name:
  14. record_obj = record_obj.filter(display_name__icontains=display_name)
  15. visit_record = list(record_obj.values())
分类 语句/返回 条数 for循环 pandasDF 释义
data = Book.objects.all() 多条
data = Book.objects.values("r1").filter(r2='xx') 多条
-> [{'r1': 'd1'}, {'r1': 'd2'}, {'r1': 'd3'}]
data = Book.objects.values_list("r1").filter(r2='xx') 多条
-> [('d1',), ('d2',)]
data = Book.objects.values_list("A", "B").filter(r2='xx') 多条
-> [('a1','b1'), ('a2','b1')]
data = Book.objects.values_list("r1", flat=True).filter(r2='xx') 多条
-> ['d1', 'd2']
data = Book.objects.get(id=1) 1条
data = Book.objects.filter(r2='xx') 多条
data = Book.objects.filter().values() 多条
data = Book.objects.exclude() 多条 条件之外
data = Book.objects.get_or_create() 多条 无就 增+查 有就查
data = Book.objects.order_by("-列") 多条 排序
print(data.query) 多条 - - 看sql语句
  1. books = Author.objects.all()# 全部,多条返回数组,for循环取出
  2. for book in books:
  3. print(book.name)

ORM的两种查询模式

方法 举例
原生sq1的查询方法 user.objects.raw("select * from user")
基于ORM方法查询 User.objects.filter(id=xx)

基于ORM的常用查询方法

方法名 描述
User.objects.all() 返回user表中的所有数据
user.objects.get(**filter) 返回满足条件的数据(单条,没有数据则抛出异常)
User.objects.filter(**filter) 返回满足条件的数据(多条,没有数据则返回空数据)
User.objects.all()/filter().exists() 返回是否有对象,True False
User.objects.all())/filter().count() 返回获取到对象的数量
User.objects.all()/filter().exclude(**filter) 返回的数据中排除满足**filter的
User.objects.filter().distinct("age") 返回的对象中通过某个列去重
user.objects.filter().order_by("age") 返回对象中通过age排序
dir(user.objects) 查询其他方法

深入查询

属性名 描述 举例
__exact 类似于sql中的like精准查找方法 name__exact=正心
__iexact 精准查找且忽略大小写 name__iexact=正心
__contains 模糊查找类似”like %正心%” name__contains="正心"
__icontains 模糊查找且忽略大小写 name__icontains="make"
__gt 大于 age__gt=18
__gte 大于等于 age__gte=18
__lt 小于 age__lt=18
__lte 小于等于 age__lt=18
__isnull 是否为空 email__isnull=True
__startswith 以什么开头 name__contains="make"
__istartswith 同上,且忽略大小写 name__contains="make"
__endswitch 以什么结尾 name__contains="make"
__iendswitch 同上,且忽略大小写 name__contains="make"
__in 查询在表中的哪个数据 name__in=[正心,make]

获得最大值(时间)

  1. latester = Book.objects.filter(r2='xx').latest('edit_time') # 最后的时间
  2. big_time = latester.edit_time
  3. print(big_time) # 获得最大时间
  4. # sql是ORDER BY `book`.`edit_time` DESC LIMIT 1
  5. # 速度很快

Django1.2以上就有latest()
Django从1.6起有了last()这个方法,可以依据主键直接取出最新的那个id
Django1.6起有一个earliest()最早、最小

book.objects.get

  1. result = book.objects.get(id=id)
  2. result = {
  3. 'id': result.id,
  4. 'name': result.name,
  5. 'add_time': result.add_time.strftime('%Y-%m-%d %H:%M:%S'),
  6. 'update_time': result.update_time.strftime('%Y-%m-%d %H:%M:%S'),
  7. }