Django的多对多关系
2019-08-24 本文已影响0人
布拉豆
多对多关系本质比一对一和多对一都要复杂
一个文章只有一个作者,但是可以有多个标签,不同文章还有相同和不同的标签。先来介绍下标签类和文章类的关系
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,如图:
image2. 后台给文件添加tag
启动命令,并登陆后台,可以看到文章的详情页面中会有另一个可多选的选项,如图:
image下面有一个说明,安装Control或者Command键,多选。选好之后然后保存
这里做了如下几个操作,魏则西事件中:
-
Tag表中,只有娱乐、财经两个标签
-
魏则西事件选择了财经
-
诈骗师选择了财经和娱乐
-
第一篇文章选择了娱乐
-
都保存了,切记
3. 查询和反向查询
这次同样是和多对一的查询测试一样用shell来操作,启动命令:python manage.py shell
。
正向查询,通过文章查询到文章的标签,例如第一篇文章的娱乐
反向查询,通过标签查询文章,例如财经查询到诈骗师和魏则西事件
image首发于《Crossin的编程教室》
以上就是本篇文章的全部介绍内容了
!放在最后
如果文章中有什么错误或者建议修改的地方,欢迎留言纠正和回复
如果你喜欢本篇文章,不妨关注一下我们的公众号,每周更新两篇原创技术文档,都是干货
image