编辑我的问题以使其更清晰。我很抱歉,如果我要求的是明显的或容易解决的,我刚刚开始。
您好,我正在开发一个网站,其内容包含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个模型中获取对象列表。所以,我非常感谢任何形式的帮助,因为我是一个业余编程(非常明显),我完全被这个问题所困扰。
答案 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=True
,null=True
表示您 没有关联的漫画/文章与给定标记,即一个标记可能发生标记只漫画但没有文章
获取具有相同标记的文章列表:
Article.objects.filter(tags__name="your_tag_name")