Django的多对多关系

作者: 布拉豆 | 来源:发表于2019-08-24 10:16 被阅读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,如图:

image

2. 后台给文件添加tag

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

image

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

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

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

  • 魏则西事件选择了财经

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

  • 第一篇文章选择了娱乐

  • 都保存了,切记

3. 查询和反向查询

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

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

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

image

首发于《Crossin的编程教室》


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


!放在最后

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

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

image

相关文章

  • Django 模型间的关系

    Django模型之间的关系 Django模型的对应关系,一对一,一对多,以及多对多的关系。 一对一 OneToOn...

  • django 模型关系

    django 模型间的关系分为多对一,一对一,多对多 一、多对一关系 1.1 创建多对一模型model 通过For...

  • Django 2.1.7 模型管理器 models.Manage

    上一篇Django 2.1.7 模型的关联讲述了关于Django模型一对多、多对多、自关联等模型关系。 在查询数据...

  • Django的多对多关系

    多对多关系本质比一对一和多对一都要复杂 一个文章只有一个作者,但是可以有多个标签,不同文章还有相同和不同的标签。先...

  • Django中关系查询

    1 Django中关系查询 一对一 一对多 多对多 1.1 一对多 1.1.1 app下创建models类 1.1...

  • Django Model

    django的模型挺好的,不用自己写SQL。外键,多对多,一对多,多对一。 参考:Django Project

  • Django——多对一关系

    Django的ORM中,有多种关系,例如多对一,一篇文章只能有一个作者,但是一个作者可以写多篇文章,这样就形成了多...

  • model relationships

    django提供了三种表示关系的东西 多对一 多对多 一对一 多对一 ForeignKey 接收的第一个参数就是对...

  • Django - ORM多对多

    现实生活中多对多的实例有: 这个ManyToManyField可以在两个Class的任何一个都无所谓,在数据库中生...

  • django 多对多模型

    文集和文章之间的关系是一个典型的多对多关系(购物车和商品的关系也是是一样),用关系型数据库可以很好的处理,需要有一...

网友评论

    本文标题:Django的多对多关系

    本文链接:https://www.haomeiwen.com/subject/emufectx.html