一对多

环境

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

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

django2外键,F表达式,Q表达式的更多相关文章

  1. Django2 外键遇到的坑

    # 出版社 class Publisher(models.Model): # 自增.主键 id id = models.AutoField(primary_key=True) # varchar(32 ...

  2. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

  3. 聚合函数与F/Q表达式

    聚合函数 取名: field + __ + 聚合函数名字 ,如:price__avg:可传关键字参数修改名字:avg=Avg("price"): aggregate:不会返回一个  ...

  4. ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )

    必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...

  5. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

  6. Django2.0里model外键和一对一的on_delete参数

    在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: TypeError: __init__() missing 1 r ...

  7. 77.Q表达式详解

    Q表达式可以包裹查询条件,可以在多个条件之间进行操作:与或非等.Q表达式一般会放在filter()中进行使用,F表达式一般是放在update()中进行使用. 定义模型的models.py文件中,示例代 ...

  8. Django2.0之后使用外键时遇到 __init__() missing 1 required positional argument: 'on_delete'

    1.Django2.0之后使用外键时遇到 __init__() missing 1 required positional argument: 'on_delete' 需要在外键创建时给on_dele ...

  9. 关于django2.0的外键关系新特性之on_delete!

    Django2.0里model外键和一对一的on_delete参数 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错: ...

随机推荐

  1. 【oracle】lpad函数 作用(填充)

  2. Github上 10 个开源免费且优秀的后台控制面板

    Web 开发中几乎的平台都需要一个后台管理,但是从零开发一套后台控制面板并不容易,幸运的是有很多开源免费的后台控制面板可以给开发者使用,那么有哪些优秀的开源免费的控制面板呢?我在 Github 上收集 ...

  3. xBIM之二:构建墙和门窗

    研究了两天,终于实现了利用xBIM自动输出墙和门窗 比较粗糙的源码如下: private void Form1_Load(object sender, EventArgs e) { //first c ...

  4. [LeetCode] 34. Find First and Last Position of Element in Sorted Array 在有序数组中查找元素的第一个和最后一个位置

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  5. 2,[VS入门教程] 使用Visual Studio写c语言 入门与技巧精品文~~~~优化篇

    本文导航: 关闭界面特效以提高流畅度 解决调试时出现"无法查找或打开PDB文件"的符号问题 注册微软账号并在vs登录 使用Visual Studio Team Services,同 ...

  6. 关于ENVI5.0菜单栏不能正常显示(win7 x86系统)

    在安装了envi5.0之后,打开显示的并不是之前4.8版本的样式也就罢了,还不能正常的将菜单栏显示出来. 上网搜了下,发现又是一个是版本兼容的问题 解决: 找到Envi5.0 右键---属性---兼容 ...

  7. PLSQL安装过程和SCOTT用户被锁的解决方法

    一.PLSQL安装: PLSQL基本就是一键式安装,没有什么需要修改的东西,一路Next就行了. 二.SCOTT用户被锁问题解决 1.问题如下: SCOTT用户默认是被锁的,需要通过system管理员 ...

  8. pyqt 调用QT设计师创建的对话框

    一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 二.实验步骤 2.1 ...

  9. ImageView的adjustViewBounds属性

    adjustViewBounds属性的定义如下: 调整ImageView的边界,使得ImageView和图片有一样的宽高比 这个属性只有在ImageView一边如宽度或高度固定,一边为wrap_con ...

  10. pytest_demo_实战2_fixture应用

    1.py文件所在文件夹下创建 __init__.py 文件 2.文件夹目录下:创建conftest.py import pytest # @pytest.fixture() 里面没有参数,那么默认sc ...