一对多
环境
两个类:书的类别和文章,一片文章只能有一个作者,一个作者可以有多个文章,这之间组成了一对多的关系
class Category(models.Model): category = models.CharField(max_length=100) def __str__(self): return self.category class Article(models.Model): title = models.CharField(max_length=20,verbose_name='书名') info = models.TextField(verbose_name='内容') author = models.CharField(max_length=10, verbose_name='作者') f = models.ForeignKey(to='Category',on_delete=models.CASCADE)#如果不想用article_set这种形式查找,可以使用related_name='articles',那么在视图one_to_many函数中就可以使用articles = category.articles.all()
添加文章
def add_article(request): article = Article(title='钢铁是怎样炼成的',info='不知道',author='疯子') article.f = Category.objects.get(id=1) article.save() return HttpResponse('添加文章成功')
通过书的类型查找文章
def one_to_many(request): category = Category.objects.first() articles = category.article_set.all()#all可以换成filter或者first for i in articles: print(i.title) print(i.author) print(i.content) return HttpResponse('ok')
一对一
环境
如果一张表里面字段非常都可以考虑把一张表拆成2张表,这样在查询的时候比在一张表上查询速度快,例子:一个用户表,一个用户扩展信息表,这是一对一个关系,一个用户只能对应一个扩展信息,同样的道理,一个用户扩展信息只能对应一个用户
models.py内容
class Users(models.Model): name = models.CharField(max_length=10) # def __str__(self): # return 'name:%s' % self.name class Users_Extend(models.Model): school = models.CharField(max_length=100) telephone = models.CharField(max_length=11) extend_info = models.OneToOneField('Users', on_delete=models.CASCADE)
view视图
#通过用户查看用户的扩展信息
def one_to_one(request): # users = Users(name='疯子') # users.save() # extend = Users_Extend(school='交通大学',telephone=120) # extend.extend_info_id = 1 # extend.save() extend = Users_Extend.objects.first() print(extend.extend_info.name) return HttpResponse('添加用户成功')
view视图
#通过扩展信息查看用户 def one_to_one(request): users = Users.objects.first() print(users.users_extend) return HttpResponse('添加用户成功')
多对多
环境
一个文章可以有多个标签,一个标签也可以有多个文章,这样就形成了多对多的关联表,如果是多对多的表关联,就必须存在第三章表
models.py内容
class Article(models.Model): title = models.CharField(max_length=20,verbose_name='书名') info = models.TextField(verbose_name='内容') author = models.CharField(max_length=10, verbose_name='作者') # f = models.ForeignKey(to='Category',on_delete=models.CASCADE,related_name='articles') tag = models.ManyToManyField('Tag') def __str__(self): return '(id:%s title:%s info:%s)' % (self.id, self.title,self.info) class Tag(models.Model): tag = models.CharField(max_length=100) def __str__(self): return 'tag:%s' % self.tag
view视图
def many_to_many(request): # 插入一篇文章 # article = Article(title='水浒传',info='武松打虎',author='施耐庵') # article.save() # 取出一个标签对象 # tag = Tag.objects.first() # 在标签里添加文章 # tag.article_set.add(article) # tag.save() # # print(article,tag) # return HttpResponse('写入文章分类成功') #查看第一个标签下面有什么文章 tag = Tag.objects.first() article = tag.article_set.all() print(article) #查看一个文章有什么标签 article = Article.objects.first() tags = article.tag.all() print(tags) return HttpResponse('查看文章分类成功')
F表达式
如果有一个场景,将运维部门所有的员工工资全部涨1000块钱,那么传统的方法如下:这样的方式效率是比较低的,这种方式需要把所有员工的工资查找出来放入到python内存当中,然后循环每一个员工的工资做+=1000的操作,然后在保存回数据库当中,F表达式是用来优化ORM数据库的
models.py内容
class Employee(models.Model): name = models.CharField(max_length=10) salary = models.IntegerField()
传统方式
def employee(request): # 传统加工资方式 users = Employee.objects.all() for user in users: user.salary += 1000 user.save()
F表达式
def employee(request): # F表达式 # Employee.objects.update(salary=F("salary")+1000) Employee.objects.filter(salary__lt=2200).update(salary=F("salary")+1000) return HttpResponse('涨薪成功')
Q表达式
如果要查找工资是2200并且姓名是冯明可以用:Employee.objects.filter(salary=2200,name='冯明'),那么如果我想查找工资是2200或者姓名为肖龙的数据呢?这就需要借助Q表达式,Q表达式可以表示或的关系,具体实现如下:
def employee(request): # Q表达式 res = Employee.objects.filter(salary=2200,name='冯明') # res = Employee.objects.filter(Q(salary=2200)|Q(name='肖龙')) print(res.values()) return HttpResponse('涨薪成功')
ORM转变的sql语句
from django.db import connection#查看sql语句的方法 from django.shortcuts import render,redirect,reverse from .models import Article,Category,Users,Users_Extend,Tag,Employee from django.http import HttpResponse from django.db.models import F from django.db.models import Q print(connection.queries)#查看sql语句