日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django 笔记6 -- 多表查询

發布時間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 來自定義反向引用名
# 使用方法,格式: User.objects.filter(反向查詢名__字段名=value)# 示例,設:models.ForeignKey("User", on_delete=models.CASCADE, related_query_name='article') users = User.objects.filter(article__title='abc')

GOOD LUCK!


總結

以上是生活随笔為你收集整理的Django 笔记6 -- 多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。