1. 区别
基于对象的跨表查询相当于sql的子查询
基于双下划綫的跨表查询类似于sql的联表查询
2. 基于对象的查询
""" 正向查询 按外键字段 一对一,多对一,多对多都是用"."来连接 是否需要加all() 多对多的时候需要加all() 一对多和一对一都不需要加all() 外键字段关联的数据可能有多条还是单条 有多条则需要加all 没有则不需要 书写orm语句跟写sql语句一致 不要想着一次性将语句书写完成 写一步执行看结果 再接着写 """ """ 反向查询 按表名小写 一对一只需要表名小写
多对一和多对多可能需要:(不加_set.all()如果不出错就不加,如果出错就加上) 什么时候需要加_set.all() 当结果可能有多个的时候 不需要加_set.all() 当结果只会是一个的时候 """
3. 基于双下划綫的跨表查询
正向查询用 关联字段+双下划线
反向查询用 表名小写+双下划线
class UserInfo(AbstractUser): # 需要扩展User,所以要继承AbstractUser phone = models.BigIntegerField(verbose_name='手机号', null=True, blank=True) # 该字段可以不填
本段代码中null=True是告诉数据库字段可以为空
blank=True是告诉Django admin后台管理字段可以为空