ORM的概念以及如何创建表

一,ORM的概念

1.什么是ORM?
    映射关系对象
    # 不但python中有,在其他语言也有
2.特点
    在操作数据库的时候,不用在写原生SQL语句
    """相对而言,封装程度太高,执行效率低"""
3.ORM书写的位置
    在models.py文件中
4.文件中如何使用?
    类名   》》》   表名
    对象   》》》   记录
    属性   》》》   字段
5.如何来创建表
# 创建一张表,必须继承,models
class User(models.Model):
    # 组合索引,联合索引
    # id int primary key auto_increment
id = models.IntegerField(primary_key = True)

# username, max_length 必须写
# username varchar (32)
username = models.CharField(max_length=32)  # varchar(32)

 # password, orm支持自定义数据类型
    # password int
password = models.IntgerField(max_length= 32) # char()

6.类写完之后,一定要进行数据库迁移,才能正真的创建出来数据表
"""
    python manage.py makemigrations      # 将操作记录到小本本上(migration文件)
    python manage.py migrate
"""

# 凡是跟数据相关的操作都要执行以上两句话

# 补充:orm不能创建数据库,必须提前把库创建完成

  

二,字段的增删改查

"""
    如果你的表有主键,并且主键名也叫id,那么可以省略不写,自动创建
    如果你的主键名不叫id,那么 需要指定。
"""

创建一张表出来,必须继承models

class User(models.Model):
    
    # id int primary key auto_increment
    id = models.IntegerField(primary_key=True)

    # username, max_length 必须写
    username = models.CharField(max_length=32)

       # password, orm支持自定义数据类型
    password = models.CharField(max_length=32)  # char() 

  

三,ORM数据的增删改查

1,增加数据   必须继承models
    # sql : insert into t1 ( ) 。。。。
    # ORM
        第一种方式:
            res=models.User.objects.create(username='ly', password=123)

    """
        返回值是当插入的数据对象
    """

    print(res.username)


    # 第二种方式:
            obj=models.User(username='ly1', password=123)
            obj.save()    # 这句话才是正真的操作数据





2,修改数据:第一种方式
    # sql:update db1 set username=' ', password = ' ' where id=1 and ...
    # orm : models.user.objects.filter(id=1)update(username='ly')
    # models.User.objects.filter(id=1).update(username='LY')
    # models.User.objects.filter(pk=1).update(username='LY')

    return HttpResponse("hello")   # 会根据条件下修改的次数返回相同的次数
    '''返回值是影响的行数'''
        # 第二种方式
    res = models.User.objects.filter(pk=1).all()[0]
    # res = models.User.objects.filter(pk=1).first()  # all()[0]
    # filter里面的条件是and关系
    # res = models.User.objects.filter(pk=1, username='aaaa11').first()  # [0]
    # res = models.User.objects.filter(username='aaaa').filter(password=123).all()  # [0]
    '''只要返回值是QuerySet对象,那么,就可以一直点queryset提供的方法'''
    # print(res) # <QuerySet [<User: User object>]>
    # print(res.username)
    # print(res.password)
    res.username = 'aaaa'
    res.save()




   3,删除:delete from user where id = 1
    models.User.objects.filter(pk=1).delete()

  

四,orm创建表关系

# mysql是关系型数据库

一对一:
	'''外键字段建在任何一方都可以,但是,推荐建在使用频率比较高的一张表'''
一对多
	'''
		外键字段建在多的一方
	'''
多对多
	'''
		外键字段不建在任何一张表,而是,建在第三张表中
	'''
eg:
	
	图书表
    出版社表
    作者表
    作者详情表
    
    '''
    	图书和出版社是一对多,图书是多,出版社是一
    	图书和作者是多对多的关系
    	作者和作者详情表是一对一
    '''
    
    # 不常用的数据我们称之为冷数据,
    # 常用的数据我们称之为热数据
 # ORM创建表关系
# 1. 先创建这张表的基础字段,
# 2. 在回头创建外键字段

# 图书表

class Book(models.Model):
    title = models.CharField(max_length=32)
    '''mysql 小数的表示
        float
        double
        decimal(5, 2) 999999.99
    '''
    # price = decimal(8, 2)
    price = models.DecimalField(max_digits=8, decimal_places=2) # 金额
    
    # 写外键 写在一对多的多的下面(查询频率高的一方)
    # publish_id = models.ForeignKey(to='Publish', to_field='id')
    publish_id = models.ForeignKey(to='Publish')  # 如果关联的是id字段,那么可以省略不写
    # publish_id = models.ForeignKey(to=Publish)  # 如果关联的是id字段,那么可以省略不写

    authors = models.ManyToManyField(to='Author') # 多对多
    '''
        authors是一个虚拟字段,不会真正的在book表中创建出来这个字段
        这个字段是关联第三张表的
    '''
    
# 出版社表
class Publish(models.Model):
    addr = models.CharField(max_length=32)


# 作者表
class Author(models.Model):
    name = models.CharField(max_length=128)

    author_detail = models.OneToOneField(to='AuthorDetail') # 一对一
    # 或者 (本质) :models.ForeignKey(unique=True)  一对多(唯一)
# 作者详情表
class AuthorDetail(models.Model):
    phone = models.CharField(max_length=32)
   

  

 

posted @ 2022-03-07 19:30  殷国敏  阅读(301)  评论(0)    收藏  举报