Django - ORM数据增删改

  • 作者:lwj
  • 分类:Django
  • 发表日期:2021-10-24 20:36:11
  • 阅读(42)
  • 评论(0)

模型类定义如下:

from django.db import models

# 自定义图书类
class BookInfo(models.Model):
    """图书模型"""
    title = models.CharField(max_length=200, verbose_name="书名")
    date = models.DateField(verbose_name="发布日期")
    bread = models.IntegerField(default=0, verbose_name="阅读量")
    comment = models.IntegerField(default=0, verbose_name="评论数")
    is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")

    class Meta:
        db_table = "tb_books"      # 自定义表的名字
        verbose_name = "图书"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title

# 自定义英雄模型类
class HeroInfo(models.Model):
    GENDER_CHOICES = (  # 枚举
        (0, 'female'),
        (1, 'male')
    )
    hero_name = models.CharField(max_length=20, verbose_name="英雄名称")
    # 默认值为0,只取元组GENDER_CHOICES中枚举的值
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name="性别")
    comment = models.CharField(max_length=200, null=True, verbose_name="描述信息")              # 可以为null值
    book = models.ForeignKey(to=BookInfo, on_delete=models.CASCADE, verbose_name="图书")       # 外键
    is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")

    class Meta:
        db_table = "tb_heros"
        verbose_name = "英雄"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.hero_name

Django提供了模型类对象.save()模型类.objects.create()两种方法进行数据新增

save方法

from .models import BookInfo

book = BookInfo()
book.title = "三国演义"
book.date = "1990-11-11"
book.save()             # 通过save方法保存数据到数据库
print(book)

Django启动时会自动执行如上代码,执行到book.save()时将结果保存到数据库,并之后打印保存数据的title信息,如下:

create方法

from .models import BookInfo

book = BookInfo.objects.create(
    title="水浒传",
    date="1991-10-10"
)
print(book)

Django启动时会自动执行如上代码,执行到模型类.objects.create时不仅创建了新的对象而且直接将信息存储到数据库里,并之后打印保存数据的title信息,如下:

外键字段的传参存在两种方式,

1. 给外键赋值时直接赋值外键表示的模型对象

from .models import BookInfo, HeroInfo

book = BookInfo.objects.create(
    title="水浒传",
    date="1991-10-10"
)
print(book)

hero = HeroInfo.objects.create(
    hero_name="武松",
    comment='打虎',
    book=book        # 给外键直接赋值时, 要赋值外键表示的模型对象, 外键变量名不需加"_id"
)
print(hero)

执行结果如图:

2. 给外键赋值时赋值外键_id

from .models import BookInfo, HeroInfo

book = BookInfo.objects.create(
    title="水浒传",
    date="1991-10-10"
)
print(book)

hero = HeroInfo.objects.create(
    hero_name="鲁智深",
    comment='倒拔垂杨柳',
    book_id=book.id      # 如果是给外键_id赋值,则必须赋关联模型对象的id
)
print(hero)

执行结果如下:

存在默认值和可为null值的字段可以为空, 保存结果也可以直接进入数据库查看


Django提供了delete()方法来执行物理删除

# 单个删除
book = BookInfo.objects.get(pk=35)
book.delete()                               # 删除模型类, 即删除单个

# 批量删除
book = BookInfo.objects.filter(pk__gt=35)
book.delete()                               # 删除查询结果的QuerySet对象, 即批量删除主键大于35的数据

Django提供了save()update()方法进行数据修改

save方法:修改模型类的属性,通过save()保存模型对象

book = BookInfo.objects.get(pk=35)
book.tb_name= "西游记"                 # 修改模型类属性
book.save()                           # 在通过save()保存

update方法:修改模型类的属性,通过update()修改QuerySet对象,会返回修改的行数

book = BookInfo.objects.filter(pk__gt=34)
num = book.update(title="七仙女")        # 直接修改QuerySet对象,返回受影响的行数
print(num)

使用情境上,update更加适用于批量数据更新,而save则只适合做单条记录的数据更新操作,当然,确定数据是否存在时则可选择save,不存在则新增一条数据

 

 

觉得不错,支持一下!

提交评论

您尚未登录,登录之后方可评论~ 登录 or 注册

评论列表

暂无评论
返回顶部

建议反馈

1. 可在博文底部留言评论

2. 发邮件到i_suichuan@163.com