一、简单操作
定义:面向对象和关系型数据库的一种映射,通过操作对象的方式操作数据
对应关系:
- 类对应数据表
- 对象对应数据行(记录)
- 属性对应字段
导入:from app01 import models
查:
- models.Publisher.objects.all()
- 查询所有的数据,queryset:对象列表
- 查询所有的数据,queryset:对象列表
- models.Publisher.objects.get(name='xxxx')
- 对象,获取一个对象(有且唯一),获取不到或者获取到多个对象会报错
- models.Publisher.objects.filter(name='xxxx')
- 获取满足条件的所有的对象,queryset:对象列表
- models.Publisher.objects.all()
增:
- models.Publisher.objects.create(name='xxx')
- 新插入数据库的对象
- obj = models.Publisher(name='xxx')
- 存在在内存中的对象
- obj.save()
- 提交到数据库中,新增
- models.Publisher.objects.create(name='xxx')
删:
- obj = models.Publisher.objects.get(pk=1)
- obj.delete()
- obj.delete()
- obj_list = models.Publisher.objects.filter(pk=1)
- obj_list.delete()
- obj = models.Publisher.objects.get(pk=1)
改:
- obj = models.Publisher.objects.get(pk=1)
- obj.name = 'new name'
- 在内存中修改对象的属性
- obj.save()
- 提交数据,保存到数据库中
二、 字段
常用字段
- AutoField:自增的整型字段,必填参数primary_key=True
- 注意:一个model不能有两个AutoField字段
- IntegerField:整数类型,数值的范围是 -2147483648 ~ 2147483647
- CharField:字符类型,必须提供max_length参数,max_length表示字符的长度
- DateField:日期类型,日期格式为YYYY-MM-DD,相当于Python中的datetime.date的实例
- 参数:
- auto_now_add=True:新增数据的时候会自动保存当前的时间
- auto_now=True:新增、修改数据的时候会自动保存当前的时间
- 参数:
- DatetimeField:日期时间类型,格式为
YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
,相当于Python中的datetime.datetime的实例 - BooleanField:布尔值类型
- TextField:文本类型
- DecimalField:十进制小数
- 参数:
- max_digits:小数总长度
- decimal_places:小数位总长度
- 参数:
- AutoField:自增的整型字段,必填参数primary_key=True
自定义字段
- 自定义一个char类型字段
class MyCharField(models.Field): """ 自定义的char类型的字段类 """ def __init__(self, max_length, *args, **kwargs): self.max_length = max_length super(MyCharField, self).__init__(max_length=max_length, *args, **kwargs) def db_type(self, connection): """ 限定生成数据库表的字段类型为char,长度为max_length指定的值 """ return 'char(%s)' % self.max_length
- 使用自定义char类型字段
class Class(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=25) # 使用自定义的char类型的字段 cname = MyCharField(max_length=25)
三、 字段参数
- null:数据库中字段是否可以为空
- default:数据库中字段的默认值
- primary_key:数据库中字段是否为主键
- db_index:数据库中字段是否可以建立索引
- unique:数据库中字段是否可以建立唯一索引
- blank:Admin中是否允许用户输入为空
- choices:Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
- choices=((0, '女'), (1, '男') :可填写的内容和提示
四、 Model Meta参数
在表对于的类中写入一个类Meta
class UserInfo(models.Model): nid = models.AutoField(primary_key=True) username = models.CharField(max_length=32) class Meta: # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名 db_table = "table_name" # admin中显示的表名称 verbose_name = '个人信息' # verbose_name加s verbose_name_plural = '所有用户信息' # 联合索引 index_together = [ ("pub_date", "deadline"), # 应为两个存在的字段 ] # 联合唯一索引 unique_together = (("driver", "restaurant"),) # 应为两个存在的字段
五、 ORM操作——必知必会13条
- all():查询所有结果,返回QuerySet对象
- get():返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误,返回单个对象
- filter():返回所有符合条件的对象,返回QuerySet对象
- exclude():返回所有不符合条件的对象,返回QuerySet对象
- values('字段'):拿到对象指定的字段和字段的值,返回的是一个字典序列,返回QuerySet对象
- values_list('字段'):拿到对象指定的字段的值,返回的是一个元组序列,返回QuerySet对象
- order_by():对查询结果排序,默认升序,字段前加负号则为降序,返回QuerySet对象
- order_by('age','-pid'):先按age字段升序排列,再按pid字段降序排列
- reverse():对查询结果反向排序,只能对已经排序的QuerySet进行反转,返回QuerySet对象
- distinct():对查询结果进行去重,完全相同的内容才能去重,返回QuerySet对象
- count():计数,返回数据库中匹配查询的对象数量,返回数字
- first():返回第一条记录,即取第一个元素,没有返回None,返回单个对象
- last():返回最后一条记录,即取最后一个元素,没有返回None,返回单个