一对多

环境

两个类:书的类别和文章,一片文章只能有一个作者,一个作者可以有多个文章,这之间组成了一对多的关系

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语句

最新文章

  1. stanford corenlp的TokensRegex
  2. Android中View绘制流程以及invalidate()等相关方法分析
  3. 【WebApi】————.net WebApi开发(一)
  4. AIR 程序开发系列 之五 保存数据的几种方式
  5. unexpected error ConnectionError object has no attribute
  6. bootstap 滚动监听
  7. 简单的webservice
  8. Redshift扩容及踩到的坑
  9. Sybase分页存储过程实现
  10. UML 解析
  11. 社群公会GangSDK:程序员入行AI领域需要哪些技能?
  12. geth搭建私有网络
  13. 20175204 张湲祯 2018-2019-2《Java程序设计》 第一周学习总结
  14. 解决更新ssh后在/etc/init.d下无sshd的问题
  15. Python开发系列
  16. week07 13.1 NewsPipeline之 一 NewsMonitor
  17. Go语言 函数,工程管理
  18. (转)C# Aop简单扫盲及ORM实体类属性拦截示例
  19. ArduinoYun教程之Arduino环境与Linux环境的桥梁Bridge
  20. [Linux实用工具]munin-node插件配置和插件编写

热门文章

  1. java为什么学JavaScript?
  2. Spring Cloud微服务安全实战_3-5_API安全之常见问题
  3. biopython处理中蜂基因组
  4. bash shell——sum
  5. ajax与重定向
  6. [随笔]冲NOIP一等奖。。
  7. Python正则表达式学习与运用
  8. [LeetCode] 565. Array Nesting 数组嵌套
  9. SpringBootThymeleaf案例
  10. Leetcode 第137场周赛解题报告