Django -- 单表操作

野性酷女 2021-11-17 12:16 365阅读 0赞

ORM简介

1, ORM是 对象—关系—映射 的简称.实现了数据模型与数据库的解耦,即数据库的设计不需要依赖特定的数据库,通过简单的配置就可以轻松更换数据库

2, 类对象 —> sql —> pymysql —> mysql服务端 —> 磁盘,orm其实就是将类对象的语法翻译成sql语句的一个引擎

建表操作

1, 创建表

  1. # app 应用下的 models.py 文件中写
  2. from django.db import models
  3. class UserInfo(models.Model): # UserInfo 为表名
  4. id = models.AutoField(primary_key=True)
  5. name = models.CharField(max_length=10)
  6. age = models.IntegerField()
  7. current_date = models.DateField()

2, 更多字段和参数

字段

ContractedBlock.gif ExpandedBlockStart.gif

  1. <1> CharField
  2. 字符串字段, 用于较短的字符串.
  3. CharField 要求必须有一个参数 max_length, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.
  4. <2> IntegerField
  5. 用于保存一个整数.
  6. <3> DecimalField
  7. 一个浮点数. 必须 提供两个参数:
  8. <4> AutoField
  9. 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
  10. 自定义一个主键:my_id=models.AutoField(primary_key=True)
  11. 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.

参数

ContractedBlock.gif ExpandedBlockStart.gif

  1. (1)null
  2. 如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False.
  3. (1)blank
  4. 如果为True,该字段允许不填。默认为False
  5. 要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
  6. 如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
  7. (2)default
  8. 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用,如果你的字段没有设置可以为空,那么将来如果我们后添加一个字段,这个字段就要给一个default
  9. (3)primary_key
  10. 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True
  11. Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
  12. 否则没必要设置任何一个字段的primary_key=True
  13. (4)unique
  14. 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的
  15. (5)choices
  16. 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。
  17. (6)db_index
  18.   如果db_index=True 则代表着为此字段设置数据库索引。
  19. DatetimeFieldDateFieldTimeField这个三个时间字段,都可以设置如下属性。
  20. (7)auto_now_add
  21. 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
  22. (8)auto_now
  23. 配置上auto_now=True,每次更新数据记录的时候会更新该字段,标识这条记录最后一次的修改时间

3, settings配置

若想将模型转为mysql数据库中的表,需要在 settings.py 中配置:

ContractedBlock.gif ExpandedBlockStart.gif

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME':'库名',
  5. 'USER':'root',
  6. 'PASSWORD':'666',
  7. 'HOST':'127.0.0.1',
  8. 'PORT':3306
  9. }
  10. }
  11. # 打印sql语句
  12. LOGGING = {
  13. 'version': 1,
  14. 'disable_existing_loggers': False,
  15. 'handlers': {
  16. 'console':{
  17. 'level':'DEBUG',
  18. 'class':'logging.StreamHandler',
  19. },
  20. },
  21. 'loggers': {
  22. 'django.db.backends': {
  23. 'handlers': ['console'],
  24. 'propagate': True,
  25. 'level':'DEBUG',
  26. },
  27. }
  28. }

项目文件夹下的 init.py文件中,写下面两句

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

执行数据库同步指令

  1. python manage.py makemigrations # 生成记录,每次修改了models里面的内容或者添加了新的app,新的app里面写了models里面的内容,都要执行这两条
  2. python manage.py migrate # 执行上面这个语句的记录来创建表,生成的表名字前面会自带应用的名字,例如:你的book表在mysql里面叫做app01_book表

增加数据

已建好的表数据(model.py) :

  1. from django.db import models
  2. class Data(models.Model):
  3. name = models.CharField(max_length=10)
  4. age = models.IntegerField()
  5. current_data = models.DateField()
  6. def __str__(self):
  7. return self.name

1, 创建方式一:

  1. from app import models
  2. student_obj = models.Data(
  3. name = 'alex',
  4. age = 73,
  5. current_data= '2008-08-08'
  6. )
  7. student_obj.save()

2, 创建方式二(常用此创建):

  1. from app import models
  2. new_obj = models.Data.objects.create(
  3. name = 'wusir',
  4. age = 83,
  5. current_data= '2008-08-15',
  6. )
  7. print(new_obj) # Data object --> model对象
  8. print(new_obj.name,new_obj.age) # .属性 可以获取对应字段的数据

3, 创建方式三

  1. from app import models
  2. lis = []
  3. for i in range(10):
  4. obj = models.Data(
  5. name = 'xin',
  6. age = 18,
  7. current_data= '2010-10-10'
  8. )
  9. lis.append(obj)
  10. models.Data.objects.bulk_create(lis) # 批量插入,速度快

4, 创建方式四: update_or_create 有就更新,没有就创建

  1. from app import models
  2. models.Data.objects.update_or_create(
  3. name = 'taibai', # 有就更新
  4. defaults={
  5. 'age':89,'current_data':'2011-11-11'}
  6. name = 'xuefei', # 没有就创建
  7. defaults={
  8. 'age':18,'current_data':'2000-08-08'}
  9. )

查询数据

1, 简单查询

ContractedBlock.gif ExpandedBlockStart.gif

  1. # all() 查询所有的数据,返回的是queryset集合
  2. all_objs = models.Data.objects.all()
  3. print(all_objs)
  4. for i in all_objs:
  5. print(i.name) # 拿到每一个名字
  6. # 条件查询: filter()方法, 返回的也是queryset集合,查询不到内容不会报错,返回一个<QuerySet []>空的queryset
  7. objs = models.Data.objects.filter(id=15)
  8. print(objs[0].name,objs[1].age) # 通过索引.字段取值
  9. objs = models.Data.objects.filter(id=1,name='alex').update(name='eva',age=20)
  10. print(objs)
  11. 打散的形式传参
  12. objs = models.Data.objects.filter(**{
  13. 'id':15,'name':'xuefei'})
  14. print(objs)
  15. # 条件查询 : get()方法,返回的是model对象,而且get方法有且必须只有一个结果
  16. objs = models.Data.objects.get(id=15)
  17. print(objs)
  18. 查询的数据不存在会报错,得到的结果有两个时会报错
  19. # exclude(**kwargs):排除的意思,包含了与所给筛选条件不匹配的对象,没有不等于操作, objects控制器和queryset集合都可以调用,返回值是queryset类型.
  20. ex = models.Data.objects.exclude(name='xin')
  21. ex = models.Data.objects.all().exclude(name='xin')
  22. print(ex)
  23. # order_by(): queryset类型的数据来调用,查询结果进行排序,默认是按照id的升序排序的,返回值还是queryset类型,在字段前面加个 - 号,就是降序排序
  24. ord = models.Data.objects.order_by('-age','id') # 多条件排序,按照age进行降序,age相同的按照id升序排序
  25. print(ord)
  26. # reverse() : queryset类型的数据来调用,对查询结果反向排序,返回值还是queryset类型
  27. rev = models.Data.objects.order_by('id').reverse()
  28. print(rev)
  29. # count() : queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。
  30. con = models.Data.objects.all().count()
  31. print(con)
  32. # first() : queryset类型的数据来调用,返回第一条记录,得到的都是model对象
  33. obj = models.Data.objects.all().first()
  34. print(obj)
  35. # last(): queryset类型的数据来调用,返回最后一条记录,结果为model对象类型
  36. obj = models.Data.objects.all().last()
  37. print(obj)
  38. # exists() : queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False,空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits
  39. # values(*field) : 用的比较多,queryset类型的数据来调用,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列,model的实例化对象,而是一个可迭代的字典序列,只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。
  40. # values_list(*field): 它与values()非常相似,它返回的是一个元组序列
  41. obj = models.Data.objects.all().filter(age=16).values('name','age')
  42. print(obj)
  43. obj = models.Data.objects.all().filter(age=16).values_list('name','age')
  44. print(obj)
  45. # distinct(): values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录,结果还是queryset
  46. query = models.Data.objects.all().values('age').distinct()
  47. print(query)

2, 基于双下划线的模糊查询 

ContractedBlock.gif ExpandedBlockStart.gif

  1. mes = models.Data.objects.filter(price__in=[100,200,300]) # price值等于这三个里面的任意一个的对象
  2. mes = models.Data.objects.filter(price__gt=100) # 大于,大于等于是price__gte=100,别写price>100,这种参数不支持
  3. mes = models.Data.objects.filter(price__lt=100) # 小于
  4. mes = models.Data.objects.filter(price__range=[100,200]) # sql的between and,大于等于100,小于等于200
  5. mes = models.Data.objects.filter(title__contains="python") #title值中包含python的
  6. mes = models.Data.objects.filter(title__icontains="python") #不区分大小写
  7. mes = models.Data.objects.filter(title__startswith="py") #以什么开头,istartswith 不区分大小写
  8. all_books = models.Book.objects.filter(pub_date__year=2012) #找2012年的所有书籍
  9. all_books = models.Book.objects.filter(pub_date__year__gt=2012) # 找大于2012年的所有书籍
  10. all_books = models.Book.objects.filter(pub_date__year=2019,pub_date__month=2) #找2019年月份的所有书籍

删除数据

  1. delete queryset model对象都可以调用
  2. models.Student.objects.get(id=3).delete() # model对象来调用的delete方法
  3. models.Student.objects.filter(name='Alex').delete()
  4. models.Student.objects.all().delete() # 删除所有

更改数据

  1. model对象不能调用更新方法 报错信息'Student' object has no attribute 'update'
  2. 只能queryset调用
  3. models.Student.objects.get(name='alex').update(age=38) # 报错
  4. models.Student.objects.filter(name='alex').update(age=38)

转载于:https://www.cnblogs.com/wenxin1120/p/11259571.html

发表评论

表情:
评论列表 (有 0 条评论,365人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Django -- 操作

    ORM简介 1, ORM是 对象--关系--映射 的简称.实现了数据模型与数据库的解耦,即数据库的设计不需要依赖特定的数据库,通过简单的配置就可以轻松更换数据库 2,