Django:model中的ForeignKey理解


有兩個數據模型欄目模型和文章模型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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM