django-表关系的多对多
使用多对多的关系
创建两个ORM模型:
在models.py中 ManyToManyField
from django.db import models class Tag(models.Model): name = models.CharField(max_length=100) articles = models.ManyToManyField('Article') class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField()
使用下面这两条命令在数据库中映射:(注意进入项目路径以及有虚拟环境的进入虚拟环境)
python manage.py makemigrations
python manage.py migrate
PS:多对多的话这里就在额外的创建一张表,名称是两个表的名字组合形式,这张表是一张中间表,自动关联了Tag表中的id字段以及Article的id字段.
接着在views.py中写上视图函数,也就是插入数据并且保存,这样就关联上多对多的关系了
from .models import Article,Tag def many_to_many(request): article = Article.objects.first() #获取该表下的第一条数据对象 tag = Tag(name='热门文章') tag.save() article.tag_set.add(tag) #在多对多中,是没有bulk的自动保存的方法的,所以我们要自动保存 return HttpResponse('success') #然后在urls.py中做映射即可
简单在做一次多对多的关联:
在views.py中:
def many_to_many(request): # article = Article.objects.first() #获取该表下的第一条数据对象 # tag = Tag(name='热门文章') # tag.save() # article.tag_set.add(tag) #在多对多中,是没有bulk的自动保存的方法的,所以我们要自动保存 tag = Tag.objects.get(pk=1) #获取该表下的id=1的数据 article = Article.objects.get(pk=2) #获取该表下的id=2的数据 tag.article_set.add(article) #在tag表下在关联articles表的数据,使用add加入这条数据(中间表在起作用) return HttpResponse('success') #再之前的基础上继续关联即可
如果需要更改默认的查询方法:
因为当你创建好了ORM模型后,django会自动为你创建一个小写的名为 表名_set的方法
可以自己重新更改
在models.py中 那么以后再使用查询方法的时候,都是通过这个名字来查询 原来的 表名_set的方法 不可用了
class Tag(models.Model): name = models.CharField(max_length=100) articles = models.ManyToManyField('Article',related_name='tags')
在views.py中
def many_to_many(request): article = Article.objects.get(pk=1) #获取该表下主键或者id为1的数据 tags = article.tags.all() #这里的tag_set 被你更改为了 tags 方法了
return HttpResponse('success')