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')

猜你喜欢

转载自www.cnblogs.com/ifdashui/p/11895431.html