如何在Django中为两个模型创建内容标记系统?

时间:2015-09-29 17:20:48

标签: django django-models

编辑我的问题以使其更清晰。我很抱歉,如果我要求的是明显的或容易解决的,我刚刚开始。

您好,我正在开发一个网站,其内容包含2个模型:文章和漫画。现在我想要一个允许我用某些关键字标记文章和漫画的系统。然后,可以使用这些关键字从两个模型中检索对象列表并显示它们。

首先,我按如下方式设置系统:

chartHeight

然而,这并没有成功。

然后我尝试为2种不同的模型实现2种不同的标签模型:ArticleTag和ComicTag,采用以下方式:

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种不同的标签模型,因此也不是优选的。

用户根据我之前提供的信息建议了ManyToManyField。但是,这究竟如何运作?

现在,使用Django创建内容标记系统的最佳方法是什么?它应该最好只使用3个模型:文章,漫画和标签,而不是像我试过的4。总而言之,我想要一个系统,让我可以使用一个标签从2个模型中获取对象列表。所以,我非常感谢任何形式的帮助,因为我是一个业余编程(非常明显),我完全被这个问题所困扰。

1 个答案:

答案 0 :(得分: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=Truenull=True表示您 没有关联的漫画/文章与给定标记,即一个标记可能发生标记只漫画但没有文章

获取具有相同标记的文章列表:

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