Django的多对多关系

多对多关系本质比一对一和多对一都要复杂

一个文章只有一个作者,但是可以有多个标签,不同文章还有相同和不同的标签。先来介绍下标签类和文章类的关系

1. 标签和文章

首先需要定义一个标签类,只需要一个tag的属性,其余的都不需要,如下:

class Tag(models.Model):
   tag = models.CharField(max_length=16, null=True, blank=True)
   def __str__(self):
       return self.tag

这里仅仅是定义了一个Tag标签,里面只有一个属性,tag,存放一些标签名,例如八卦、新闻、财经、社会等

然后就是给文章,使用多对多关联。这个多对多是放哪个类中?放文章类,在文章的编辑中,就应该主动关联Tag类中的实例

现在来编辑文章的Model类,如下代码:

class Article(models.Model):
   headline = models.CharField(null=True, blank=True, max_length=300)
   content = models.TextField(null=True, blank=True)
   auth = models.ForeignKey(to=User, related_name="write", null=True,blank=True,default=None)
   tags =models.ManyToManyField(to=Tag,related_name="tag_article",null=True,blank=True,default=None)
   def __str__(self):
       return self.headline

只是添加了一行tags,多对多关联,关联目标是Tag,反向查询的设定的tag_article。默认空,因为有数据所以必须加这条

然后就是makemigrations和migrate,如图:

Django的多对多关系_第1张图片

2. 后台给文件添加tag

启动命令,并登陆后台,可以看到文章的详情页面中会有另一个可多选的选项,如图:

Django的多对多关系_第2张图片

下面有一个说明,安装Control或者Command键,多选。选好之后然后保存

这里做了如下几个操作,魏则西事件中:

  • Tag表中,只有娱乐、财经两个标签

  • 魏则西事件选择了财经

  • 诈骗师选择了财经和娱乐

  • 第一篇文章选择了娱乐

  • 都保存了,切记

3. 查询和反向查询

这次同样是和多对一的查询测试一样用shell来操作,启动命令:python manage.py shell

正向查询,通过文章查询到文章的标签,例如第一篇文章的娱乐

反向查询,通过标签查询文章,例如财经查询到诈骗师和魏则西事件

 

Django的多对多关系_第3张图片

 

 

首发于《Crossin的编程教室》

 

 


以上就是本篇文章的全部介绍内容了


 

!放在最后

 

如果文章中有什么错误或者建议修改的地方,欢迎留言纠正和回复

 

如果你喜欢本篇文章,不妨关注一下我们的公众号,每周更新两篇原创技术文档,都是干货

Django的多对多关系_第4张图片

你可能感兴趣的:(Spbeen,Django2,爬虫教程)