1 modle基本数据类型

  1. class Test(models.Model):
  2. """测试学习用"""
  3. Auto = models.AutoField() # 自增长字段
  4. BigAuto = models.BigAutoField()
  5.  
  6. # 二进制数据
  7. Binary = models.BinaryField()
  8.  
  9. # 布尔型
  10. Boolean = models.BooleanField()
  11. NullBoolean = models.NullBooleanField()
  12.  
  13. # 整型
  14. PositiveSmallInteger = models.PositiveSmallIntegerField(db_column="age") # 5个字节
  15. SmallInteger = models.SmallIntegerField(primary_key=False) # 6个字节
  16. PositiveInteger = models.PositiveIntegerField() # 10个字节
  17. Integer = models.IntegerField(verbose_name="11个字节大小") # 11个字节
  18. BigInteger = models.BigIntegerField(unique=True) # 20个字节
  19.  
  20. # 字符串类型
  21. Char = models.CharField(max_length=100, null=True, blank=True, db_index=True) # varchar
  22. Text = models.TextField(help_text="这个是longtext") # longtext
  23.  
  24. # 时间日期类型
  25. Date = models.DateField(unique_for_date=True, auto_now=True)
  26. DateTime = models.DateTimeField(editable=False, unique_for_month=True, auto_now_add=True)
  27. Duration = models.DurationField() # int, Python timedelta实现
  28.  
  29. # 浮点型
  30. Float = models.FloatField()
  31. Decimal = models.DecimalField(max_digits=4, decimal_places=2) # 11.22, 16.34
  32.  
  33. # 其它字段
  34. Email = models.EmailField() # 邮箱
  35. Image = models.ImageField()
  36. File = models.FileField()
  37. FilePath = models.FilePathField()
  38. URL = models.URLField()
  39. UUID = models.UUIDField()
  40. GenericIPAddress = models.GenericIPAddressField()

2 modle的 外键

  主要有三类: 一对一 models.OneToOneField (如一个表字段太多,有些字段平时不怎们用到,可利用外键将其另建表关联) ,一对多 models.ForeignKey ( 如老师对课程 )   , 多对多 models.ManyToManyField ( 如学生对课程 )

  1. class A(models.Model):
  2. onetoone = models.OneToOneField(Test, related_name="one")
  3.  
  4. class B(models.Model):
  5. foreign = models.ForeignKey(A, on_delete=models.CASCADE) # 删除级联
  6. foreign = models.ForeignKey(A, on_delete=models.PROTECT)
  7. foreign = models.ForeignKey(A, on_delete=models.SET_NULL, null=True, blank=True) # 删除置空
  8. foreign = models.ForeignKey(A, on_delete=models.SET_DEFAULT, default=0) #外键删除之后设置默认值,必须设置默认值
  9. foreign = models.ForeignKey(A, on_delete=models.DO_NOTHING) #什么也不做
  10. foreign = models.ForeignKey(A, on_delete=models.SET)
  11.  
  12. class C(models.Model):
  13. manytomany = models.ManyToManyField(B)
  14.  
  15. # 1.所有字段都有的参数
  16. # 2.个别字段才有的参数
  17. # 3.关系型字段的参数
  18.  
  19. """
  20. on_delete 当一个被外键关联的对象被删除时,Django将模仿on_delete参数定义的SQL约束执行相应操作
  21. 如下6种操作
  22. CASCADE:模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除!(该操作为当前Django版本的默认操作!)
  23. PROTECT:阻止上面的删除操作,但是弹出ProtectedError异常
  24. SET_NULL:将外键字段设为null,只有当字段设置了null=True时,方可使用该值。
  25. SET_DEFAULT:将外键字段设为默认值。只有当字段设置了default参数时,方可使用。
  26. DO_NOTHING:什么也不做。
  27. SET():设置为一个传递给SET()的值或者一个回调函数的返回值。注意大小写。
  28. """

  补充:自关联时,传入的类名为self,

  1. pid = models.ForeignKey('self', null=True, blank=True, verbose_name="自关联")

3 modle 的 元数据Meta

  1. class AddressInfo(models.Model): # coures_addressinfo
  2. """省市县地址信息"""
  3. address = models.CharField(max_length=200, null=True, blank=True, verbose_name="地址")
  4. pid = models.ForeignKey('self', null=True, blank=True, verbose_name="自关联")
  5. # pid = models.ForeignKey('AddressInfo', null=True, blank=True, verbose_name="自关联")
  6. note = models.CharField(max_length=200, null=True, blank=True, verbose_name="说明")
  7.  
  8. def __str__(self): # __unicode__(self)
  9. return self.address
  10.  
  11. class Meta:
  12. # 定义元数据
  13. db_table = 'address'
  14. # ordering = ['pid'] # 指定按照什么字段排序
  15. verbose_name = '省市县地址信息'
  16. verbose_name_plural = verbose_name
  17. # abstract = True
  18. # permissions = (('定义好的权限', '权限说明'),)
  19. # managed = False
  20. unique_together = ('address', 'note') # ((),())
  21. # app_label = 'courses'
  22. # db_tablespace # 定义数据库表空间的名字

  补充

  1 也可以在modle类中自定义函数 可以调用这些函数方法实现一些功能,如用在template模板中调用这些方法。

  1. class Teacher(models.Model):
  2. ......
  3.  
  4. def __str__(self): # Python2:__unicode__
  5. return f'Teacher : {self.nickname}'
  6.  
  7. def get_course_num(self):
  8. """获取课程数"""
  9. return self.Course_set.all().count()
  10.  
  11. class Course(models.Model):
  12. """课程信息表"""
  13. teacher = models.ForeignKey(Teacher, null=True, blank=True, on_delete=models.CASCADE,
  14. verbose_name="课程讲师") # 删除级联

 · 在html模板中调用此函数  {{ teacher.get_course_num }}

  2  对于一些字段 里面采用choice 来规定存储值范围的的调用,如:

    degree = models.CharField(max_length=7, choices=(('primary', '初级'), ('midd', '中级'), ('high', '高级')), verbose_name='课程难度')

    数据库中的值限定在 ('primary', 'midd', 'high') 之中,我们希望显示为 ( '初级',  '中级', '高级' ) 可以采用 {{ course.get_degree_display }}

4 利用modle对数据库进行操作:

  

  1. from django.db.models import Count, Avg, Max, Min, Sum, F, Q
  2. from django.views.generic import View
  3.  
  4. class IndexView(View):
  5. """主页"""
  6.  
  7. def get(self, request):
  8. # # 1.查询、检索、过滤
  9. # teachers = Teacher.objects.all()
  10. # print(teachers)
  11. # teacher2 = Teacher.objects.get(nickname='Jack') # get()只能返回一条结果,多条则会报错
  12. # print(teacher2, type(teacher2))
  13. # teacher3 = Teacher.objects.filter(fans__gte=500) # QuerySet, 可以是多条结果
  14. # for t in teacher3:
  15. # print(f"讲师姓名{t.nickname}--粉丝数{t.fans}")
  16. # # 2.字段数据匹配,大小写敏感
  17. # teacher4 = Teacher.objects.filter(fans__in=[666, 1231])
  18. # print(teacher4)
  19. # teacher5 = Teacher.objects.filter(nickname__icontains='A')
  20. # print(teacher5)
  21. # # 3.结果切片、排序、链式查询
  22. # print(Teacher.objects.all()[:1])
  23. # teacher6 = Teacher.objects.all().order_by('-fans')
  24. # for t in teacher6:
  25. # print(t.fans)
  26. # print(Teacher.objects.filter(fans__gte=500).order_by('nickname'))
  27. # # 4.查看执行的原生SQL
  28. # print(str(Teacher.objects.filter(fans__gte=500).order_by('nickname').query))
  29. # 结果为:
  30. """SELECT `courses_teacher`.`nickname`, `courses_teacher`.`introduction`, `courses_teacher`.`fans`,
  31. `courses_teacher`.`created_at`, `courses_teacher`.`updated_at` FROM `courses_teacher`
  32. WHERE `courses_teacher`.`fans` >= 500 ORDER BY `courses_teacher`.`nickname` ASC
  33. """
  34. """返回新QuerySet API"""
  35. # 1.all(), filter(), order_by(), exclude(), reverse(), distinct()
  36. # s1 = Student.objects.all().exclude(nickname='A同学')
  37. # for s in s1:
  38. # print(s.nickname, s.age)
  39. # s2 = Student.objects.all().exclude(nickname='A同学').reverse()
  40. # for s in s2:
  41. # print(s.nickname, s.age)
  42.  
  43. # 2.extra(), defer(), only() 实现字段别名,排除一些字段,选择一些字段
  44. # s3 = Student.objects.all().extra(select={"name": "nickname"})
  45. # for s in s3:
  46. # print(s.name)
  47. # print(str(Student.objects.all().only('nickname', 'age').query))
  48.  
  49. # 3.values(), values_list() 获取字典或元组形式的QuerySet
  50. # print(TeacherAssistant.objects.values('nickname', 'hobby'))
  51. # print(TeacherAssistant.objects.values_list('nickname', 'hobby'))
  52. # print(TeacherAssistant.objects.values_list('nickname', flat=True))
  53.  
  54. # 4.dates(), datetimes() 根据时间日期获取查询集
  55. # print(Course.objects.dates('created_at', 'year', order='DESC'))
  56. # print(Course.objects.datetimes('created_at', 'year', order='DESC'))
  57.  
  58. # 5.union(), intersection(), difference() 并集、交集、差集
  59. # p_240 = Course.objects.filter(price__gte=240)
  60. # p_260 = Course.objects.filter(price__lte=260)
  61. # print(p_240.union(p_260))
  62. # print(p_240.intersection(p_260))
  63. # print(p_240.difference(p_260))
  64.  
  65. # 6.select_related() 一对一、多对一查询优化, prefetch_related() 一对多、多对多查询优化;反向查询
  66. # courses = Course.objects.all().select_related('teacher')
  67. # for c in courses:
  68. # print(f"{c.title}--{c.teacher.nickname}--{c.teacher.fans}")
  69.  
  70. # students = Student.objects.filter(age__lt=30).prefetch_related('course')
  71. # for s in students:
  72. # print(s.course.all())
  73. # print(Teacher.objects.get(nickname="Jack").course_set.all())
  74.  
  75. # 7.annotate() 使用聚合计数、求和、平均数 raw() 执行原生的SQL
  76. # print(Course.objects.values('teacher').annotate(vol=Sum('volume')))
  77. # print(Course.objects.values('teacher').annotate(pri=Avg('price')))
  78.  
  79. # """不返回Query API"""
  80. # # 1.获取对象 get(), get_or_create(), first(), last(), latest(), earliest(), in_bulk()
  81. # print(Course.objects.first())
  82. # print(Course.objects.last())
  83. # print(Course.objects.earliest())
  84. # print(Course.objects.latest())
  85. # print(Course.objects.in_bulk(['Python系列教程4', 'Golang系列教程1']))
  86. #
  87. # # 2.创建对象 create(), bulk_create(), update_or_create() 创建,批量创建,创建或更新
  88. #
  89. # # 3.更新对象 update(), update_or_create() 更新,更新或创建
  90. # Course.objects.filter(title='Java系列教程2').update(price=300)
  91. #
  92. # # 4.删除对象 delete() 使用filter过滤
  93. # Course.objects.filter(title='test').delete()
  94. #
  95. # # 5.其它操作 exists(), count(), aggregate() 判断是否存在,统计个数,聚合
  96. # print(Course.objects.filter(title='test').exists())
  97. # print(Course.objects.filter(title='Java系列教程2').exists())
  98. # print(Course.objects.count())
  99. # print(Course.objects.aggregate(Max('price'), Min('price'), Avg('price'), Sum('volume')))
  100. # courses = Course.objects.values('teacher').annotate(t=GroupConcat('title', distinct=True,
  101. # ordering='title ASC',
  102. # separator='-'))
  103. # for c in courses:
  104. # print(c)
  105.  
  106. # Course.objects.update(price=F('price') - 11)
  107. print(Course.objects.filter(volume__lte=F('price') * 10))
  108.  
  109. print(Course.objects.filter(Q(title__icontains='java') & Q(volume__gte=5000)))
  110.  
  111. print(Course.objects.filter(Q(title__icontains='golang') | Q(volume__lte=1000)))

  

5 django 的modle不经可以在django view这些地方操作,也可以调用此modle对数据库进行操作,如不用写 sql 语句而使用相关 modle类 对数据库数据实现导入导出修改查找等操作(即orm),

  1. import os
  2. import sys
  3. import random
  4. import django
  5. from datetime import date
  6.  
  7. project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  8. sys.path.append(project_path) # 将项目路径添加到系统搜寻路径当中
  9. os.environ['DJANGO_SETTINGS_MODULE'] = 'imooc.settings' # 设置项目的配置文件
  10. django.setup()
  11.  
  12. from courses.models import Teacher, Course, Student, TeacherAssistant
  13.  
  14. def import_data():
  15. """使用Django ORM导入数据"""
  16. # 讲师数据 create()
  17. Teacher.objects.create(nickname="Jack", introduction="Python工程师", fans=666)
  18.  
  19. # 课程数据 bulk_create()
  20. Course.objects.bulk_create([Course(title=f"Python系列教程{i}", teacher=Teacher.objects.get(nickname="Jack"),
  21. type=random.choice((0, 1, 2)),
  22. price=random.randint(200, 300), volume=random.randint(100, 10000),
  23. online=date(2018, 10, 1))
  24. for i in range(1, 5)])
  25.  
  26. # 学生数据 update_or_create()
  27. Student.objects.update_or_create(nickname="A同学", defaults={"age": random.randint(18, 58),
  28. "gender": random.choice((0, 1, 2)),
  29. "study_time": random.randint(9, 999)})
  30. # 正向添加
  31. # 销量大于等于1000的课程
  32. Student.objects.get(nickname="A同学").course.add(*Course.objects.filter(volume__gte=1000))
  33. # 反向添加
  34. # 学习时间大于等于500小时的同学
  35. Course.objects.get(title="Python系列教程1").student_set.add(*Student.objects.filter(study_time__gte=500))
  36. # 助教数据 get_or_create()
  37. TeacherAssistant.objects.get_or_create(nickname="助教1", defaults={"hobby": "慕课网学习", "teacher":
  38. Teacher.objects.get(nickname="Jack")})
  39. return True
  40.  
  41. if __name__ == "__main__":
  42. if import_data():
  43. print("数据导入成功!")

  注: 导入modle 类必须在 django.setup() 之后导入,否则找不到路径

注: 主要参考 慕课网课程  全面掌握Django ORM  https://www.imooc.com/learn/1087

django orm 基本的更多相关文章

  1. django orm总结[转载]

    django orm总结[转载] 转载地址: http://www.cnblogs.com/linjiqin/archive/2014/07/01/3817954.html 目录1.1.1 生成查询1 ...

  2. Django ORM - 001 - 外键表查询主表信息

    开始用Django做web开发,我想大家都会遇到同样的问题,那就是如何高效快速的查询需要的数据,MVC都很简单,但是ORM折腾起来就有些费时间,我准备好好研究下Django ORM,所以会有一个系列的 ...

  3. Django ORM 中的批量操作

    Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定 ...

  4. Django ORM 查询管理器

    Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...

  5. Django ORM模型的一点体会

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...

  6. 数据库表反向生成(二) Django ORM inspectdb

    在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...

  7. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

  8. django orm 及常用参数

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

  9. Django ORM中,如何使用Count来关联对象的子集数量

    示例models 解决方法 有时候,我们想要获取一个对象关联关系的数量,但是我们不要所有的关联对象,我们只想要符合规则的那些关联对象的数量. 示例models # models.py from dja ...

  10. Django ORM存储datetime 时间误差8小时问题

    今天使用django ORM 将获取到的时间入库,并未出现问题,但是后来发现时间晚了8小时,经查询Django官方文档发现获取本地时间和UTC时间有差别. 首先科普下:UTC是协调世界时 UTC相当于 ...

随机推荐

  1. CF1012B Chemical table 构造_思维_并查集

    我们可以将横坐标和纵坐标看成是点.发现这些点之间是有传递性的. 题中说明,如果有矩阵中三个顶点被选,则底角的点也会被覆盖,发现这些点之间是有传递性的.那么我们最终达到的目的就是使整个图中只有 111 ...

  2. Pyhton学习——Day39

    # CSS的常用属性# 1 颜色属性# <div style="color:rgb(255,0,0)">ppppp</div># 2 字体属性# font- ...

  3. 基础——(5)D Flip-Flop(D触发器)

    之前搞了一个 D-Latch,看一下下图是怎么变化的 In D-latch anytime its enabled the input D is going to be output at Q 使用c ...

  4. 四、分布式 Git(未完待续)

    一.分布式工作流程 在 Git 中,每个开发者同时扮演着节点和集线器的角色——也就是说,每个开发者既可以将自己的代码贡献到其他的仓库中,同时也能维护自己的公开仓库,让其他人可以在其基础上工作并贡献代码 ...

  5. JAVA 重载方法,参数为NULL时,调用的处理 (精确性原则)

    引子:大家可以思考一下下面程序的输出结果 public class TestNull { public void show(String a){ System.out.println("St ...

  6. [luogu]P3572 [POI2014]PTA-Little Bird(单调队列)

    P3572 [POI2014]PTA-Little Bird 题目描述 In the Byteotian Line Forest there are nn trees in a row. On top ...

  7. Visual Studio 2015 改变窗体图标 & 任意位置打开窗体 & 禁止鼠标改动窗体大小

    1.改变窗体图标 先把图标放到项目文件夹中,然后点击窗体属性的ICON添加即可. 参考:https://www.cnblogs.com/yangxuli/p/8075484.html?tdsource ...

  8. 监控aps.net计数器

  9. LaTeX 图片色偏解决方法

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50327113 在LaTeX的编辑模式中 ...

  10. MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)(转)

    在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的. MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们. 1:Jav ...