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

如何在Django中为两个模型创建内容标签系统?,django,django-models,Django,Django Models,编辑了我的问题以使其更清楚。我很抱歉,如果我问的是显而易见的或者很容易解决的问题,我只是刚刚开始 您好,我正在开发一个网站,其中有两个模型的内容:文章和漫画。现在我想要一个系统,允许我用特定的关键字标记文章和漫画。然后可以使用这些关键字从两个模型中检索对象列表并显示它们 首先,我将系统设置如下: class Article(models.Model): ..... class Comic(models.Model): ..... class Tag(models.Model):

编辑了我的问题以使其更清楚。我很抱歉,如果我问的是显而易见的或者很容易解决的问题,我只是刚刚开始

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

首先,我将系统设置如下:

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)
然而,这并没有奏效

然后,我尝试用以下方式为两种不同的模型实现两种不同的标记模型: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)
这也不起作用,因为我能够获得文章的标签列表,但是我无法获得具有相同标签的文章列表。而且它使用了两种不同的标签模型,所以这也不是最好的

一位用户根据我之前提供的信息建议了一个ManyToManyField。然而,这究竟是如何工作的呢

现在,使用Django创建内容标签系统的最佳方法是什么?它最好只适用于3个模型:文章、漫画和标签,而不是我尝试的4个。总之,我想要一个系统,它允许我使用一个标记从两个模型中获取对象列表。所以,我非常感谢任何形式的帮助,因为我是一个业余编程爱好者(很明显),我完全被这个问题难住了。

你可以使用一个

基本上如下所示。如果将
ArticleTag.tag
的名称更改为
ArticleTag.name
,则更直观。我还向M2M关系添加了一个
相关的\u name
字段,这样您就可以使用
article.objects.filter(tags\uu name=“tag\u name\u here”)
根据文章的标记检索文章。相反,您可以使用
ArticleTag.objects.filter(article\uu title=“article\u name\u here”)
获取文章的所有标记

[根据更新的问题进行编辑]

根据您的更新,您可以执行以下操作:

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
    )
这样,一篇
文章
/
漫画
可以有许多不同的标签,任何一个标签都可以标记许多不同的文章/漫画。
blank=True
null=True
意味着您不必拥有与给定标记关联的漫画/文章,也就是说,一个标记可以只标记漫画而不标记文章

要获取具有相同标记的文章列表,请执行以下操作:

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

等等,请问Article.objects.filter(tags\uu name='tag\u name\u here')是否能给我一份带有该标签的文章列表?@TahmidKhanNafee你说得对-更新了我的答案,谢谢!哦,现在它是有意义的,无论如何,我用更多的信息更新了这个问题,因为上一个问题相当平淡。不过,谢谢您的回答。@TahmidKhanNafee已更新-仅供参考,如果您的编辑使其变得如此不同,通常您应该发布一个新问题-您将因此获得更多流量。希望这有帮助!哦,该死,我以为这是违反规定的。哦,再次感谢你更新的答案,我会尝试一下。
Article.objects.filter(tags__name="your_tag_name")