Django框架之模型层之手动创建第三张表、QuerySet对象API、单表操作API、多对多操作API、基于对象(子查询)/基于双下划线查询(连表查询)(正向查询,反向查询)

七.手动创建第三张表

1.自动创建(常用)

  • 优点 : 第三张表以及对应的外键关联字段不需要书写
  • 缺点 : 可扩展性差, 无法对ORM自动生成的中间表进行增加字段的操作
  • 注意 : 可以使用ORM提供给多对多关系表操作API以及正方向和双下划线查询
  • 第三张表中没有其他字段
class Author(models.Model):
    name = models.CharField(max_length=32,verbose_name='作者名')

# 通过ORM自带的ManyToManyField自动创建第三张表
class Book(models.Model):
    title = models.CharField(max_length=32,verbose_name='书名')
    authors = models.ManyToManyField(to='Author',related_name='authors')

2.全手动创建(基本不用)

  • 优点 : 可扩展性强, 第三张表的内容完全取决于自己
  • 缺点 : ORM提供给多对多关系表之间的API以及正反向和双下划线查询都不支持, 并且代码也会多一些
class Author(models.Model):
    name = CharField(max_legth=32,verbose_name='作者名')
    
class Book(models.Model):
    title = CharField(max_length=32,verbose_name='书名')
    
class BookAuthor(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')

3.半手动创建(比较常用)

  • 优点 : 既可以对第三张表进行字段的添加, 也能使用ORM提供的正反向和双下划线查询
  • 缺点 : 无法使用ORM提供的多对多表关系之间的API (add, set, remove, clear)
class Author(models.Model):
    name = models.CharField(max_length=32,verbose_name='作者名')
    
class Book(models.Model):
    title = models.CharField(max_length=32,verbose_name='书名')
    authors = models.ManyToManyField(
        to='Author',  # 建立多对多关系的表,to_field参数可以不指定默认是主键
        through='BookAuthor',  # 第三张表名
        through_fields=('book','author'))  
        # 第三张表中对应需要关联两张表的字段,以元组形式传
        # 顺序:外键字段在哪张表,该表就排在前面
        
class BookAuthor(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')

八.单表操作之增、删、改、查

QuerySet对象它是一个生成器, 也可以将其看成一个列表

1.增

# 方式一 : create()方法
models.Author.objects.create(name='Rub',age=23,email='[email protected]')

# 方式二 : 创建对象再save()保存
author_obj = models.Author(name='Rub',age=23,email='[email protected]')
author_obj.save()

2.删

# 方式一 : delete()方法
rows = models.Author.objects.all().delete()
print(rows)  # rows为影响的条数
rows = models.Author.objects.filter(pk=2).delete()  # 主键为2的删除

# 方式二 : 获取对象再进行删除delete()
author_obj = models.Author.objects.filter(name="Rub")
author_obj.delete()

3.改

# 方式一 : update()
models.Author.objects.filter(name='Rub').update(age=99)

# 方式二 : get()获取对象再进行赋值再save()保存
author_obj = models.author.objects.get(name='Rub')
author_obj.name = 'SmallRub'
author_obj.save()

4.查

  • QuerySet对象的查询方法👇

九.QuerySet对象的查询方法

ORM提供了13条查询API

1.all( ) : 查询所有结果

  • QuerySet用.all( )取值的时候,不会一下子全部取出来, 而是每次只取21条 (LIMIT21)
res = models.User.objects.all(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给你骨质唱疏松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值