Django ORM 外键/多对多

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyy72999/article/details/80271480

很多人学Python Django的时候当学到models ORM的 外键ForeignKey,多对多ManyToMany的时候 就会晕,也不知道什么时候会用,今天给大家举一个比较经典的例子,以及对应的查询,创建

  1. 我们创建一个博客,包含 文章表,分类表,标签表
  2. 文章表包含分类(外键) 标签(多对多)
  3. 实现文章添加,查询

编辑models.py 创建对应的表

class Categorys(models.Model):
    category_name = models.CharField(max_length=20) //分类表

class Tags(models.Model):
    tag_name = models.CharField(max_length=20) //标签表

class Articles(models.Model):
    title = models.CharField(max_length=50) //文章标题
    content = models.TextField() //文章内容
    describe = models.CharField(max_length=50) //文章描述信息
    tag = models.ManyToManyField(Tags)  //文章分类 比如Python Django web  多对多
    category = models.ForeignKey(Categorys,on_delete=None) //多对多,一个文章 它包含很多标签 外键

生成映射文件以及提交到数据库中
python manager makemigration
python manager makemigrate

创建文章

from models import Article,Categorys,Tags
这里面我就模拟前端传的数据了:

1: 先创建分类,和标签
tag1 = ["前端框架","后端框架"]
category = "Python"

#分类写入数据库
this = Categorys(category_name=categort)
this.save()

#标签写入数据库
for i in tag1:
    this = Tags(tag_name=i)
    this.save()

2:创建文章
title = "Python Web 全栈指南"
describe =  "从一无所有到初始Python到热爱全栈"
content = "............人生苦短,我用Python"

self = Articles(title=title,describe=describe,content=content)
self.category = Categorys.objects.filter(id=1).first() //外键需要查询主键的数据然后插入
self.save()  //必须先保存,保存之后才能继续添加tags
for i in tag1:
    tag = Tags.objects.filter(tag_name=i).first()
    self.tag.add(i) //添加多对多
    1:方法是遍历结果 然后依次调用add方法进行添加
    2:第二种是直接就self.tag.set(value) 这样会覆盖掉之前的值

查询:

比如刚才创建了一个文章,里面两个标签 "前端框架,后端框架" 分类 "Python";

1:我想查询分类是Python的文章是什么? 标签是什么?
    category = Categorys.objects.filter(category_name="Python").first()
    if category_id:
        article = Articles.objects.filter(category_name=category_id.name).first()
        print(article.content) //文章内容
        tags = article.tag.all()
        print(tags) //标签列表

猜你喜欢

转载自blog.csdn.net/yyy72999/article/details/80271480