Django之ORM

ORM全称对象关系映射

作用:通过python面向对象的代码简单快捷的操作数据库,但是封装程度太高,有时候sql语句的效率偏低,需要自己写sql语句

类----->表

对象--->记录

对象属性--->记录某个字段对应的值

写在models.py文件

1.先在models.py中书写一个类

from django.db import models

# Create your models here.
class Mytable(models.Model):
    id=models.AutoField(primary_key=True)
    #由于一张表中必须有一个主键字段,并且一般情况下都叫id字段
    #所以orm在当你不定义主键字段的时候,orm都会自动帮你创建一个名为id的主键字段
    #也就是说我们在创建模型表的时候如果主键名字没有别的叫法(比如你要叫cid就需要自己写),
    #那么主键字段可以省略不写
    name=models.CharField(max_length=32,verbose_name='用户名')
    #CharField必须指定max_length参数,不指定会直接报错
    #verbose_name是所有字段都有的,用来对字段的解释
    password=models.IntegerField(verbose_name='密码')
    

2.数据库迁移命令

2.1 在terminal中输入命令: python manage.py makemigrations

意思是将操作的记录记录到  migrations文件夹,在这文件夹下会多出一个文件

之后输入python manage.py migrate ,执行数据库迁移命令后会自动创建表

只要修改了models.py中跟数据库相关的代码,就必须重新执行上述两条命令。

2.2 偷懒输入这两句数据库迁移命令,与上一个效果一样(建议上一个命令熟练后再使用这个)

只需要输入makemigrations

                  migrate

orm字段的增删改查

字段的增加

1.在类中写好字段代码后,可以在终端内直接给出默认值

选择1给增加的字段添加默认值,选择2退出自己去代码中增加

2.该字段可以为空,null=Ture

age=models.IntegerField(null=True)

3.直接给字段设置默认值

age=models.IntegerField(default='18')

字段的修改

直接修改代码代码然后执行数据库迁移的两条命令即可

字段的删

直接注释对应的字段然后执行数据库的两条命令即可

注意:执行完毕之后字段对应的数据也都没有了,在操作models.py的时候一定要细心,执行迁移命令之前最好检查好代码

建议当你离开你的计算机之后一定要锁屏

数据的增删改查

第一种

res=models.User.objects.filter(username=username)
返回值先看成是列表套数据对象的格式
它支持索引取值 切片操作 但不支持负数索引
也不推荐使用索引取值
user_obj=models.User.objects.filter(username=username).first()

 第二种

    user_queryset=models.User.objects.all()
    return render(request,'userlist.html',locals())

第一种方式

 from app01 import models
 res=models.User.objects.create(username=username,password=password)
返回值就是当前被创建的对象本身
 print(res,res.username,res.password)

第二种方式

user_obj=models.User(username=username,password=password)
user_obj.save() #保存数据

改        

<a href="/edit_user/?user_id={{ user_obj.id }}" >编辑</a>
拼接一个url的路径?user_id
然后更新数据
models.User.objects.filter(id=edit_id).update(username=username,password=password)

models.User.objects.filter(id=delete_id).delete()

补充:真正的删除功能需要二次确认,删除功能内部其实不是真正的删除,我们会给数据添加一个标识字段用来表示数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态

ORM创建表关系

表关系:一对一,一对多,多对多

例:图书表,出版社表,作者表,作者详情表

利用orm创建表关系代码如下

from django.db import models

class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=8,decimal_places=2)
    #图书和出版社是一对多,外键字段放在多的里,也就是图书表里
    publish=models.ForeignKey(to='Publish',on_delete=models.CASCADE,null=True, blank=True, default=None)
    #会自动在publish后加_id
    #图书和作者是多对多,外键字段在任意一方,建议放在使用频率较多的一方
    authors=models.ManyToManyField(to='Author')
    #authors是一个虚拟字段,主要用来告诉orm,图书表和作者表是多对多关系,让orm自动帮你创建第三张表
class Publish(models.Model):
    name=models.CharField(max_length=32)
    addr=models.CharField(max_length=32)

class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()

    #作者和作者详情是一对一的关系,外键字段建在任意一方都可以,建议建在查询频率较高的表
    author_detail=models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE,null=True, blank=True, default=None)
class AuthorDetail(models.Model):
    phone=models.BigIntegerField()
    addr=models.CharField(max_length=32)

注意:orm创建表关系,在一对一和创建主键时需要加上,必须写on_delete,不写报错

on_delete可选参数: 

models.CASCADE  (级联删除)

当删除与该字段关联的对象时,所有相关的对象将被级联删除。例如,如果一个出版社对象被删除了,与该出版社相关联的所有图书对象也会被删除。

models.SET_DEFAULT   (设置默认值)

 当删除与该字段关联的对象时,该字段的值将设置为字段的默认值。这要求你同时定义了一个默认值。例如,如果一个出版社对象被删除了,与该出版社相关联的图书对象的出版社字段将被设置为默认的出版社。

models.SET_NULL   (设置为空)

当删除与该字段关联的对象时,该字段的值将被设置为NULL,即空。这要求你将该字段设置为可为空。例如,如果一个出版社对象被删除了,与该出版社相关联的图书对象的出版社字段将被设置为空。

models.SET()   (设置指定值或者执行函数)

当删除与该字段关联的对象时,该字段的值将被设置为指定的值或执行指定的函数。你可以传递一个值作为参数,也可以传递一个函数,该函数将在删除关联对象时执行并返回一个值。例如,你可以设置一个函数,将与删除的出版社对象创建时间相关的特定日期作为图书对象的出版日期。

 models.DO_NOTHING  (什么都不做)

当删除与该字段关联的对象时,不会进行任何操作。这意味着数据库中的关联完整性约束将被忽略,并且你需要确保在应用层面处理好相关的逻辑。要在使用这个选项时生效,你需要将db_constraint参数设置为False,以避免在数据库级别建立外键约束。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django框架的ORM(Object-Relational Mapping)是一种将对象模型与关系数据库模型进行映射的技术。其目的是让开发者使用面向对象的方式来操作数据库,而不必直接使用SQL语句。 DjangoORM实现了以下功能: 1. 定义模型:使用Django定义模型的方式非常简单,只需要创建一个继承自`django.db.models.Model`的类,并定义它的属性即可。 2. 数据库迁移:当你修改了模型之后,Django会自动帮你生成数据库迁移文件,这些文件可以在数据库中创建或修改表结构。 3. 数据库查询:使用Django ORM可以进行复杂的数据库查询,包括过滤、排序、分组等操作。 4. 数据库操作:Django ORM提供了对数据库的增删改查操作,可以方便地完成对数据的操作。 下面是一个使用Django ORM的例子: ```python from django.db import models class Author(models.Model): name = models.CharField(max_length=50) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE) published_date = models.DateField() ``` 在上面的例子中,我们定义了两个模型:`Author`和`Book`。`Author`模型有`name`和`email`两个属性,`Book`模型有`title`、`author`和`published_date`三个属性。其中,`author`属性是一个外键,它与`Author`模型建立了关联关系。 通过Django ORM,我们可以进行如下操作: 1. 创建模型表结构 ```python python manage.py makemigrations python manage.py migrate ``` 2. 添加数据 ```python author1 = Author(name='John', email='john@example.com') author1.save() book1 = Book(title='Django for Beginners', author=author1, published_date='2020-01-01') book1.save() ``` 3. 查询数据 ```python # 获取所有的作者 authors = Author.objects.all() # 获取所有的书籍 books = Book.objects.all() # 获取指定作者的所有书籍 author = Author.objects.get(name='John') books = Book.objects.filter(author=author) # 按照发布日期倒序排序 books = Book.objects.order_by('-published_date') ``` 4. 修改数据 ```python book = Book.objects.get(title='Django for Beginners') book.title = 'Django for Experts' book.save() ``` 5. 删除数据 ```python book = Book.objects.get(title='Django for Experts') book.delete() author = Author.objects.get(name='John') author.delete() ``` 总之,Django ORM可以让我们更加方便地操作数据库,提高开发效率。同时,它也具有良好的可扩展性和可维护性,可以应对各种复杂的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值