有兩個數據模型欄目模型和文章模型ArticleColumn和ArticlePost
ArticleColumn:
class ArticleColumn(models.Model): # 用戶與欄目是“一對多”關系,所以用ForeignKey,一個用戶可以設置多個欄目,此處的user字段對應實際表中的user_id,來自於User表中主鍵 user = models.ForeignKey(User, related_name='article_column') column = models.CharField(max_length=100) created = models.DateTimeField(auto_now_add=True)
ArticlePost:
class ArticlePost(models.Model): author = models.ForeignKey(User, related_name='article') title = models.CharField(max_length=200) slug = models.SlugField(max_length=500) column = models.ForeignKey(ArticleColumn, related_name='article_column') body = models.TextField() created = models.DateTimeField(default=timezone.now()) updated = models.DateTimeField(auto_now_add=True) # media/%Y%m%d/為圖片的真實放置路徑,因為settings中已經配置了MEDIA_ROOT為media文件夾,blank=True允許表單的該字段對應值為空,意思是非必填字段 avatar = models.ImageField(upload_to='%Y%m%d/', blank=True)
可以看到在ArticlePost模型中有一個字段為column,且類型為ForeignKey,意思是外鍵,代表的是“多對一”的關系,第一個參數ArticleColumn是對應的模型名稱,related_name為反查時的關聯名稱。
多對一指的是,多個文章可以對應一個欄目,比如有10篇文章都是屬於django欄目的(當然一個文章也可以對應多個欄目,這樣就是多對多關系了:ManyToManyField,此處我們設計不存在這種情況),
有了外鍵關系后,那如何去查詢某篇文章對應的所屬欄目呢?
article = ArticlePost.objects.get(id=150)
article.column
如果不使用外鍵關系,想查詢某篇文章對應的所屬欄目呢?
# 獲取該文章對象 article = ArticlePost.objects.get(id=150) # 找到該文章對象對應的column_id,column_id這一列就是因為ArticlePost模型中有column字段且將ArticleColumn作為外鍵,所以將ArticleColumn模型對應表中的主鍵id的值作為column_id的值,將列名命名為column_id
article.column_id
# 根據上面查出來的id找到該欄目對象
column = ArticleColumn.objects.get(id=article.column_id)
# 輸出欄目名稱
column.column
那怎么反查某個欄目下有多少文章呢?
# 查詢出叫django的欄目 column = ArticleColumn.objects.get(column='django') # 通過column這個實例.article_column.all(),查詢出該欄目下的所有文章,article_column就是在ArticlePost模型中的related_name的值 column.article_column.all() # 反查django這個欄目下title中包含'list'字符串的文章 column.article_column.filter(title__contains='list')