一、模型层

  1. '''django自带的sqlite数据库功能非常的少 并且对日期格式不兼容'''
  2. 1.MySQL配置
  3. 2.数据库迁移命令
  4. 3.ORM查询关键字

二、测试环境

  1. 1.python自带的console
  2. 2.py文件形式(参考manage.py前四行)
  3. import os
  4. if __name__ == "__main__":
  5. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "d19_dj6.settings")
  6. import django
  7. django.setup()
  8. # 在该代码的下方才可以正常测试django文件

三、查询关键字

  1. # 查
  2. 关键词:
  3. 1all() # 输出结果可以认为是:列表套对象
  4. 2filter()
  5. 3values() # 可以查询指定字段,输出结果可以认为是:列表套字段(列表套字典)
  6. 4values_list()
  7. 5first()与last()
  8. 6get() # 不推荐使用,django会报错
  9. 7exclude() # 取反 QuerySet 列表套数据对象
  10. 8order_by() # 排序,降序
  11. 9reverse() # 翻转
  12. 10distinct() # 去重
  13. 11count() # 计数
  14. 12exists() # 判断是否存在
  15. 13create()、update()、delete()、对象.save()
  16. # 1.all()
  17. # res = models.Books.objects.all() # QuerySet
  18. # print(res)
  19. # print(res.first())
  20. # print(res.last())
  21. # print(res[1])
  22. '''queryset支持正数的索引取值'''
  23. # print(res)
  24. # 2.filter()
  25. # res = models.Books.objects.filter(id=1) QuerySet
  26. '''pk能够自动定位当前表的主键字段 避免了你自己去频繁查看'''
  27. # res = models.Books.objects.filter(pk=2) QuerySet
  28. # print(res)
  29. '''filter括号内可以存放多个条件默认是and关系'''
  30. # res = models.Books.objects.filter(pk=2,title='jpm')
  31. # print(res)
  32. # 3.values()
  33. '''values可以指定查询的字段 结果QuerySet 列表套字段'''
  34. # res = models.Books.objects.values('title','price')
  35. # 4.values_list()
  36. '''values_list也可以指定查询的字段 结果QuerySet 列表套元组'''
  37. # res = models.Books.objects.values_list('title', 'price')
  38. # print(res)
  39. # 5.first()与last() 分别获取queryset第一个和最后一个数据对象
  40. # res = models.Books.objects.all().filter().values('title','price')
  41. # print(res)
  42. '''只要是queryset对象 就可以无限制的调用queryset对象的方法'''
  43. # 6.get() 不推荐使用
  44. # res = models.Books.objects.get(pk=1)
  45. '''get方法可以直接获取到数据对象'''
  46. # print(res,res.pk,res.title,res.price,res.publish_time)
  47. '''但是该方法当查询条件不存在的时候会直接报错 没有filter好用!!!'''
  48. # res = models.Books.objects.get(pk=100)
  49. # res1 = models.Books.objects.filter(pk=100)
  50. # print(res1)
  51. # 7.exclude() 取反 QuerySet 列表套数据对象
  52. # res = models.Books.objects.exclude(pk=1)
  53. # print(res)
  54. # 8.order_by() 排序 QuerySet 列表套数据对象
  55. # res = models.Books.objects.order_by('price')
  56. # print(res)
  57. # 9.reverse() 翻转(必须提前有顺序才可以)
  58. # res = models.Books.objects.all()
  59. # print(res)
  60. # print(res.order_by('price'))
  61. # print(res.order_by('price').reverse())
  62. # 10.distinct() 去重
  63. '''尤其要注意主键字段'''
  64. # res = models.Books.objects.all().values('title','price')
  65. # print(res)
  66. # print(res.distinct())
  67. # 11.count() 计数
  68. # res = models.Books.objects.all().count()
  69. # res1 = models.Books.objects.count()
  70. # print(res, res1) # 4 4
  71. # 12.exists() 判断结果集是否有数据(不需要使用)
  72. # res = models.Books.objects.all().exists()
  73. # res1 = models.Books.objects.filter(id=100).exists()
  74. # print(res,res1) # True False
  75. # 13.create()、update()、delete()、对象.save()

四、如何查看SQL语句

  1. 1.如果当前对象是queryset那么可以直接点query查找该对象内部SQL语句
  2. 2.配置文件(只要执行orm语句都会自动打印SQL语句)
  3. LOGGING = {
  4. 'version': 1,
  5. 'disable_existing_loggers': False,
  6. 'handlers': {
  7. 'console':{
  8. 'level':'DEBUG',
  9. 'class':'logging.StreamHandler',
  10. },
  11. },
  12. 'loggers': {
  13. 'django.db.backends': {
  14. 'handlers': ['console'],
  15. 'propagate': True,
  16. 'level':'DEBUG',
  17. },
  18. }
  19. }

五、filter的神奇的双下划线查询

  1. # 神奇双下划綫查询
  2. 1、字段名__gt= # 大于 greater than
  3. 2、字段名__gte= # 大于等于 gt or equal
  4. 3__lt= # 小于 less than
  5. 4__lte= # 小于等于
  6. 5__in=[a,b,c] # 查找列表内的
  7. 6__range=(a,b) # 范围查找,a到b之间
  8. 7__contains= # 查找字段包含某个字符的,区分大小写
  9. 8__icontains= # 查找字段包含某个字符的,忽略大小写 ignore
  10. 9__startswith='xx' # 查找字段是以xx开头
  11. 10__endswith=
  12. 11__year=2021 # 查找date类型是2021的数据
  13. 12__month=
  14. # 1.查询价格大于800的书籍
  15. # res = models.Books.objects.filter(price__gt=800)
  16. # print(res)
  17. # 2.查询价格小于800的书籍
  18. # res = models.Books.objects.filter(price__lt=800)
  19. # print(res)
  20. # 3.查询价格大于等于800的书籍
  21. # res = models.Books.objects.filter(price__gte=800)
  22. # print(res)
  23. # 4.查询价格大于等于800的书籍
  24. # res = models.Books.objects.filter(price__lte=800)
  25. # print(res)
  26. # 5.查询价格是989.45 或者278.89 或者888.21
  27. # res = models.Books.objects.filter(price__in=["888.21","278.89","989.45"])
  28. # print(res)
  29. # 6.查询加个在200到800之间的书籍
  30. # res = models.Books.objects.filter(price__range=(200,800))
  31. # print(res)
  32. # 7.查询书籍名称中包含字母p的书(区分大小写)
  33. # res = models.Books.objects.filter(title__contains='p')
  34. # print(res)
  35. # res = models.Books.objects.filter(title__icontains='p')
  36. # print(res)
  37. # 8.查询书籍是否以...开头 ...结尾
  38. # res = models.Books.objects.filter(title__startswith=)
  39. # res1 = models.Books.objects.filter(title__endswith=)
  40. # 9.查询出版日期是2021的书(常用)
  41. res = models.Books.objects.filter(publish_time__year=2021)
  42. res1 = models.Books.objects.filter(publish_time__month=11)
  43. print(res,res1)

六、图书管理系统表设计

  1. class Book(models.Model):
  2. title = models.CharField(max_length=32)
  3. price = models.DecimalField(max_digits=8, decimal_places=2)
  4. publish_time = models.DateField(auto_now_add=True)
  5. publish = models.ForeignKey(to='Publish')
  6. authors = models.ManyToManyField(to='Author')
  7. class Publish(models.Model):
  8. name = models.CharField(max_length=32)
  9. addr = models.CharField(max_length=64)
  10. class Author(models.Model):
  11. name = models.CharField(max_length=32)
  12. age = models.IntegerField()
  13. author_detail = models.OneToOneField(to='AuthorDetail')
  14. class AuthorDetail(models.Model):
  15. phone = models.BigIntegerField()
  16. addr = models.CharField(max_length=32)