版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyy72999/article/details/80271480
很多人学Python
Django
的时候当学到models ORM
的 外键ForeignKey
,多对多ManyToMany
的时候 就会晕,也不知道什么时候会用,今天给大家举一个比较经典的例子,以及对应的查询,创建
- 我们创建一个博客,包含 文章表,分类表,标签表
- 文章表包含分类(外键) 标签(多对多)
- 实现文章添加,查询
编辑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) //标签列表