Django 笔记6 -- 多表查询
生活随笔
收集整理的這篇文章主要介紹了
Django 笔记6 -- 多表查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Django 筆記6 – 多表查詢
Django 系列筆記是筆者學習、實踐使用 Django 的相關筆記,大量參考了知了課堂的《Django零基礎到項目實戰》教程。
參考文檔:
Django官方文檔(英文)
Django 中文文檔
一、一對一
1、概要
- 在實際網站中,可能需要保存用戶的許多信息,但是有些信息是不經常用的。如果把所有信息都存放到一張表中可能會影響查詢效率,因此可以把用戶的一些不常用的信息存放到另外一張表中。用戶信息的概要表和詳細表就是典型的一對一的關系。
- Django 通過 Field 為 OneToOneField 的字段實現一對一的關系。
2、ORM 模型
class User(models.Model):"""用戶信息概要表"""username = models.CharField(max_length=20)password = models.CharField(max_length=100)class UserExtension(models.Model): """用戶信息詳細表"""birthday = models.DateTimeField(null=True) school = models.CharField(blank=True,max_length=50) # 設置與 User 表一對一,反向引用名為 extensionuser = models.OneToOneField("User", on_delete=models.CASCADE, related_name='extension')3、查詢
正向引用: UserExtension 表中的對象查詢 User 表中對應對象的信息
# 查詢詳細表對象對應的概要信息的指定字段值,格式如下 UserExtension對象.一對一字段名.對應表的列名# 示例 user_extension = UserExtension.objects.get(id='xx') user_extension.user.username反向引用: User 表中的對象查詢 UserExtension 表中對應對象的信息
# 查詢用戶對象對應的詳細信息的指定字段值,格式如下 User對象.反向引用名.對應表的列名# 示例 user = User.objects.get(name='xx') user.extension.school二、一對多
1、概要
- 一個文章只能由一個作者編寫,但是一個作者可以寫多篇文章。作者和文章之間的關系就是典型的一對多的關系。
- Django 通過 Field 為 ForeignKey 的字段實現一對多的關系。
2、ORM 模型
class User(models.Model):"""用戶信息概要表"""username = models.CharField(max_length=20)password = models.CharField(max_length=100)class Article(models.Model):"""文章信息表"""title = models.CharField(max_length=100)content = models.TextField()# 設置與 User 表一對多,反向引用名為 articlesauthor = models.ForeignKey("User", on_delete=models.CASCADE, related_name='articles')3、查詢
正向引用: Article 表中的對象查詢 User 表中對應對象的信息
# 查詢文章對象對應的作者概要信息的指定字段值,格式如下 Article對象.一對多字段名.對應表的列名# 示例 article = Article.objects.get(id='xx') article.user.username反向引用: User 表中的對象查詢 Article 表中對應對象的信息
# 查詢用戶對象對應的所有文章,格式如下 User對象.反向引用名.all()# 查詢用戶對象對應的一篇文章,格式如下 User對象.反向引用名.first()# 示例 user = User.objects.get(name='xx') user.articles.all() # 可以通過遍歷 .all() 生成的對象進一步查詢到具體的字段名三、多對多
1、概要
- 一篇文章可以有多個標簽,一個標簽可以被多個文章所引用。因此標簽和文章的關系是典型的多對多的關系。
- Django 通過 Field 為 ManyToManyFiel 的字段實現多對多的關系。
- 在數據庫層面 Django 會自動生成一張中間表來關聯多對多的兩張表。
2、ORM 模型
class Article(models.Model):"""文章信息表"""title = models.CharField(max_length=100)content = models.TextField()# 設置與 Tag 表多對多,反向引用名為 articlestags = models.ManyToManyField("Tag",related_name="articles")class Tag(models.Model):"""標簽表"""name = models.CharField(max_length=50)3、查詢
正向引用: Article 表中的對象查詢 Tag 表中對應對象的信息
# 查詢文章對應的所有標簽,格式如下 Article對象.多對多字段名.all()# 示例 article = Article.objects.get(id='xx') article.tags.all()反向引用: Tag 表中的對象查詢 Article 表中對應對象的信息
# 查詢標簽對應的所有文章,格式如下 Tag對象.反向引用名.all()# 示例 tag = Tag.objects.get(name='xx') tag.articles.all()四、related_name 和 related_query_name:
1、related_name:反向引用名
- 默認為:模型名字小寫_set
- 可以通過指定 related_name 來自定義反向引用名
- 如果不使用反向引用,那么可以指定related_name=’+’
2、related_query_name:反向查詢名
- 默認為:未自定義 related_name 時為模型名小寫,自定義 related_name 時與 related_name 一致
- 可以通過指定 related_query_name 來自定義反向引用名
GOOD LUCK!
總結
以上是生活随笔為你收集整理的Django 笔记6 -- 多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言用栈编写数制转换程序,数制转换-栈
- 下一篇: 8除以2表示什么意思_八字中劫财,比肩分