ORM
Posted 周军豪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM相关的知识,希望对你有一定的参考价值。
对应关系
映射关系:
python的类名对应的SQL语句的表名
python的类属性对应的SQL语句的表名下的字段
python的类属性的约束对应的SQL语句的表名下的字段类型
类的实例对象---------------表中的一条记录对象
创建表
class Student(models.Model): nid=models.AutoField(primary_key=True) # 主键约束 name=models.CharField(max_length=32) # 字符串字段 birth=models.DateField() # 日期类型 class_id=models.IntegerField(default=0) # 整数类型
字段类型详细
使用时需要引入django.db.models包,字段类型如下: AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。 BooleanField:布尔字段,值为True或False。 NullBooleanField:支持Null、True、False三种值。 CharField(max_length=字符长度):字符串。TextField:大文本字段,一般超过4000个字符时使用。 参数max_length表示最大字符个数。 IntegerField:整数。 DecimalField(max_digits=None, decimal_places=None):十进制浮点数。FloatField:浮点数。 参数max_digits表示总位数。 参数decimal_places表示小数位数。 DateField[auto_now=False, auto_now_add=False]):日期。 TimeField:时间,参数同DateField。 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。 DateTimeField:日期时间,参数同DateField。 FileField:上传文件字段。 ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
字段选项
每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR
数据库字段的大小。还有一些适用于所有字段的通用参数。
这些参数在文档中有详细定义,这里我们只简单介绍一些最常用的:
(1)null 如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False. (1)blank 如果为True,该字段允许不填。默认为False。 要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。 如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。 (2)default 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。 (3)primary_key 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True, Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为, 否则没必要设置任何一个字段的primary_key=True。 (4)unique 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 (5)choices 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。 这是一个关于 choices 列表的例子: YEAR_IN_SCHOOL_CHOICES = ( (‘FR‘, ‘Freshman‘), (‘SO‘, ‘Sophomore‘), (‘JR‘, ‘Junior‘), (‘SR‘, ‘Senior‘), (‘GR‘, ‘Graduate‘), ) 每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。 在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如: from django.db import models class Person(models.Model): SHIRT_SIZES = ( (‘S‘, ‘Small‘), (‘M‘, ‘Medium‘), (‘L‘, ‘Large‘), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES) >>> p = Person(name="Fred Flintstone", shirt_size="L") >>> p.save() >>> p.shirt_size ‘L‘ >>> p.get_shirt_size_display() ‘Large‘
更多详见模型字段参考
一旦你建立好数据模型之后,django会自动生成一套数据库抽象的API,可以让你执行关于表记录的增删改查的操作。
创建命令
python manage.py makemigrations #生成文件
python manage.py migrate #创建表
单表操作
查询记录API:
(1)Student.objects.all() #返回的QuerySet类型 查询所有记录 [obj1,obj2....]
(2)Student.objects.filter() #返回的QuerySet类型 查询所有符合条件的记录
(3)Student.objects.exclude()#返回的QuerySet类型 查询所有不符合条件的记录
(4)Student.objects.get() #返回的models对象 查询结果必须有且只有一个,否则报错
(5)Student.objects.all().first() #返回的models对象 查询结果集合中的第一个
(6)Student.objects.filter().last() #返回的models对象 查询结果集合中的最后一个
(7)Student.objects.all().values("name","class_id") #返回的QuerySet类型 ,列表中存放的字典
(8)Student.objects.all().values_list("name","class_id") #返回的QuerySet类型 ,列表中存放的元组
(9)Student.objects.all().order_by("class_id") # 按指定字段排序,不指定,按主键排序
(9.1)Student.objects.all().order_by("-class_id") # 按指定字段 降序 排序
(10)Student.objects.all().count() # 返回的记录个数 数字类型
(11)Student.objects.all().values("name").distinct() #字段去重,用在values() 后
(12)Student.objects.all().exist() #判断是否为空,如果QuerySet包含数据,就返回True,否则返回False 原理是limit 1
单表查询之双下划线 __
Student.objects.filter()
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
lt 小于 gt大于
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
models.Tb1.objects.filter(name__contains="ven") #包含ven 区分大小写
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and 什么到什么之间(包含最后一个)
startswith, #什么开头
istartswith, #什么开头,大小写不敏感
endswith, #什么结尾
iendswith #什么结尾,大小写不敏感
添加记录:
方式1:
s=Student(name=‘‘,birth=‘‘,class_id=‘‘)
s.save()
方式2:
stu_obj=Student.objects.create(name=‘‘,birth=‘‘,class_id=‘‘) # stu_obj是添加的记录对象
删除记录:
Student.objects.filter(nid=1).delete() # QuerySet类型调用
修改记录:
Student.objects.filter(nid=1).update(name="yuan") # QuerySet类型调用
以上是关于ORM的主要内容,如果未能解决你的问题,请参考以下文章