TOP

ORM:对象关系映射(一)
2019-07-11 18:10:44 】 浏览:141
Tags:ORM 对象 关系 映射

一、简单操作

  1. 定义:面向对象和关系型数据库的一种映射,通过操作对象的方式操作数据

  2. 对应关系:

    • 类对应数据表
    • 对象对应数据行(记录)
    • 属性对应字段
  3. 导入:from app01 import models

  4. 查:

    • models.Publisher.objects.all()
      • 查询所有的数据,queryset:对象列表
    • models.Publisher.objects.get(name='xxxx')
      • 对象,获取一个对象(有且唯一),获取不到或者获取到多个对象会报错
    • models.Publisher.objects.filter(name='xxxx')
      • 获取满足条件的所有的对象,queryset:对象列表
  5. 增:

    • models.Publisher.objects.create(name='xxx')
    • obj = models.Publisher(name='xxx')
      • 存在在内存中的对象
    • obj.save()
      • 提交到数据库中,新增
  6. 删:

    • obj = models.Publisher.objects.get(pk=1)
      • obj.delete()
    • obj_list = models.Publisher.objects.filter(pk=1)
      • obj_list.delete()
  7. 改:

    • obj = models.Publisher.objects.get(pk=1)
    • obj.name = 'new name'
      • 在内存中修改对象的属性
    • obj.save()
      • 提交数据,保存到数据库中

二、 字段

  1. 常用字段

    • 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:小数位总长度
  2. 自定义字段

    • 自定义一个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)

三、 字段参数

  1. null:数据库中字段是否可以为空
  2. default:数据库中字段的默认值
  3. primary_key:数据库中字段是否为主键
  4. db_index:数据库中字段是否可以建立索引
  5. unique:数据库中字段是否可以建立唯一索引
  6. blank:Admin中是否允许用户输入为空
  7. 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条

  1. all():查询所有结果,返回QuerySet对象
  2. get():返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误,返回单个对象
  3. filter():返回所有符合条件的对象,返回QuerySet对象
  4. exclude():返回所有不符合条件的对象,返回QuerySet对象
  5. values('字段'):拿到对象指定的字段和字段的值,返回的是一个字典序列,返回QuerySet对象
  6. values_list('字段'):拿到对象指定的字段的值,返回的是一个元组序列,返回QuerySet对象
  7. order_by():对查询结果排序,默认升序,字段前加负号则为降序,返回QuerySet对象
    • order_by('age','-pid'):先按age字段升序排列,再按pid字段降序排列
  8. reverse():对查询结果反向排序,只能对已经排序的QuerySet进行反转,返回QuerySet对象
  9. distinct():对查询结果进行去重,完全相同的内容才能去重,返回QuerySet对象
  10. count():计数,返回数据库中匹配查询的对象数量,返回数字
  11. first():返回第一条记录,即取第一个元素,没有返回None,返回单个对象
  12. last():返回最后一条记录,即取最后一个元素,没有返回None,返回单个
    ORM:对象关系映射(一) https://www.cppentry.com/bencandy.php?fid=77&id=227539

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python数据库-MySQL数据库高级查.. 下一篇Python - openpyxl 读写操作Excel