2015-09-29 58 views
1

編輯我的問題,使其更清晰。如果我所問的問題很明顯或容易解決,我很抱歉,我剛剛開始。如何爲Django中的兩個模型創建內容標記系統?

您好,我正在開發一個網站,其中有2個模型的內容:文章和漫畫。現在我想要一個允許我用特定關鍵字標記文章和漫畫的系統。然後可以使用這些關鍵字從兩個模型中檢索對象列表並顯示它們。

起初,我將系統設置如下:

class Article(models.Model): 
    ..... 
class Comic(models.Model): 
    ..... 
class Tag(models.Model): 
    tag = models.CharField(max_length = 25) 
    article = models.ForeignKey(Article) 
    comic = models.ForeignKey(Comic) 

然而,這沒有工作了。

然後我試圖實現2個不同的標籤車型爲2種不同的型號:ArticleTag和ComicTag,以下列方式:

class Article(models.Model): 
    ..... 
class ArticleTag(models.Model): 
    tag = models.CharField(max_length = 25) 
    article = models.ForeignKey(Article) 

class Comic(models.Model): 
    ..... 
class ComicTag(models.Model): 
    tag = models.CharField(max_length = 25) 
    comic = models.ForeignKey(Comic) 

這也沒有工作,因爲我能夠得到的標籤列表的文章,但我無法獲得具有相同標記的文章列表。而且它也使用了2種不同的標籤模型,因此也不太可取。

根據我提供的先前信息,用戶建議了一個ManyToManyField。然而,這究竟是如何工作的?

現在,使用Django創建內容標記系統的最佳方式是什麼?它應該最好只與3個模型一起工作:文章,漫畫和標籤,而不是像我試過的那樣。總之,我想要一個系統,可以讓我使用一個標籤從2個模型中獲取對象列表。所以,我真的很感謝任何形式的幫助,因爲我是一個業餘編程(非常明顯),我完全被這個問題困住了。

回答

1

您可以使用ManyToManyField

基本上像下面這樣。如果將ArticleTag.tag的名稱更改爲ArticleTag.name,則更直觀。我還爲M2M關係添加了related_name字段,因此您可以使用Article.objects.filter(tags__name="tag_name_here")基於其標籤檢索文章。在相反的方向上,您可以使用ArticleTag.objects.filter(article__title="article_name_here")獲得文章的所有標籤。

class Article(models.Model): 
    title = models.CharField(max_length=140) 
    ..... 
class ArticleTag(models.Model): 
    name = models.CharField(max_length = 25) 
    articles = models.ManyToManyField(Article, related_name="tags") 

[根據更新後的問題編輯]

根據您的更新,你可以這樣做:

class Article(models.Model): 
    ..... 

class Comic(models.Model): 
    ..... 

class Tag(models.Model): 
    tag = models.CharField(max_length = 25) 
    articles = models.ManyToManyField(
     Article, 
     related_name="tags", 
     blank=True, 
     null=True 
    ) 
    comics = models.ManyToManyField(
     Comic, 
     related_name="tags", 
     blank=True, 
     null=True 
    ) 

這樣一個Article/Comic可以有許多不同的標籤,任何一個標籤都可以標記許多不同的文章/漫畫。 blank=True,null=True意味着你不要有一個關聯的漫畫/文章與給定的標籤,即一個標籤可能發生標籤只漫畫,但沒有文章。

要獲得的文章列表同一個標籤:

Article.objects.filter(tags__name="your_tag_name") 
+0

等待,不會Article.objects.filter(tags__name =「tag_name_here」)讓我與該標籤的文章列表? –

+0

@TahmidKhanNafee你是正確的 - 更新我的答案,謝謝! – YPCrumble

+0

哦,現在它是有道理的,無論如何,我用更多的信息更新了這個問題,因爲前一個非常乏味。不過,謝謝你的回答。 –

相關問題