Django之model补充:一对多、跨表操作

表结构概述

model.py :

class Something(models.Model):name = models.CharField(max_length=32)class UserType(models.Model):caption = models.CharField(max_length=32)s = models.ForeignKey('Something')# 超级管理员,普通用户,游客,黑河class UserInfo(models.Model):user = models.CharField(max_length=32)pwd = models.CharField(max_length=32)user_type = models.ForeignKey('UserType')# user_type_id

关系:

  • something --> usertype 一对多
  • usertype --> userinfo 一对多

表单中的数据:

something:

idname
1something1
2something2

usertype:

idcaptionsomething_id
1超级管理员1
2普通管理员1
3黑客2

userinfo:

iduserpwdusertype_id
1alex1231
2eric1232

简要说明

Django中:

  1. 某表中foreignkey关联另一张表后,会自动在本表单中创建一个名称为另一张表的列:xxx_id
  2. 一对多创建时,foreignkey需要使用在一对多中的多的表单中

查询

userinfo_obj = UserInfo.objects.all()

结果为一个类的列表,类似:[UserInfo对象,UserInfo对象,]

以上语句会得到的数据为一个元素为查询目标表单对象的列表,所以例子中的userinfo_obj为一个queryset对象我们可以通过`print(userinfo_obj.query)来查看SQL语句.

取值

比较简单:

id = userinfo_obj[0].user.id
user = userinfo_obj[0].user.user
pwd = userinfo_obj[0].user.pwd
...

values与vlue_list

queryset = UserInfo.objects.all().values('user')
结果:
[{‘user’: 'alex'},{‘user’: 'eirc'}]=================================queryset = UserInfo.objects.all().value_list('user')
结果:
[('alex'),('eirc')]

查询中:

  • 使用values('列名称'),结果为字典组成的列表
  • 使用value_list('列名称'),结果为元组组成的列表

所以,未来操作中,我们可以使用这两个方便的东西来遍历字典取值还是使用元组取值

一对多操作

创建数据

一般我们是来这么做的:

UserInfo.objects.create(user='cc','pwd' = '123'user_type=UserType.objects.get(id=2))

很麻烦吧,其实是两步操作了,但因为建表时有了user_type_id,所以我们可以这么搞:

UserInfo.objects.create(user='cc','pwd'='123',user_type_id=2)

很简单吧...

数据查询

单表查询:

UserInfo.objects.filter(user='alex')

反向查询

需求:查询所有用户类型等于 普通用户 的所有用户名和密码

两步操作:

uid = UserType.objects.filter(caption='普通用户')
userinfo_obj = UserInfo.objects.filter(user_type_id=uid)

两步操作很简单,那就引出了神奇的双下划线:__

queryset = UserInfo.objcets.filter(user_type__caption='普通用户')###结果
[UserInfo对象,UserInfo对象,UserInfo对象,]
row = queryset[0] #取到一个元素
user = row.user
password = row.pwd #取到具体信息
row.user_type.id 
row.user_type.caption 

总结下:

  • 一对多中,正下查询使用foreignkey 的 _id 查询:row.外键字段.外键表的字段
  • 一对多中反向查询,首先还是在在一对多中的多的表单中查询,可以使用__连接相关表中的列名去查询:row__

其实感觉__有点像关系连线的意思

queryset = UserInfo.objects.filter(user_type__caption='普通用户').values('user','pwd','user_type__caption')####结果
[{'user':'alex','pwd':'123','user_type__caption':'普通用户'}{'user':'eric','pwd':'123','user_type__caption':'普通用户'}]

三张表跨表操作

跟上面一样,直接用__即可

queryset = UserInfo.objects.filter(user_type__s__name='xxx')

进阶操作

获取个数:

UserInfo.objects.filter(name = 'alex').count()

大于小于,还是使用双下划线__

UserInfo.objects.filter(id__gt=2)       #获取ID大于2的数据
UserInfo.objects.filter(id__lt=5)       #获取ID小余5的数据
UserInfo.objects.filter(id__gt=2,id__lt=5)  #获取ID大于2小于5的数据

in:

UserInfo.objects.filter(id__in=[11,22,33])  #获取id等于11、22、33的数据
UserInfo.objects.exclude(id__in=[11,22,33]) #not in

contains(包含):

UserInfo.objects.filter(name__contains="ven")   #获取name列中包含'ven'的数据
UserInfo.objects.filter(name__icontains="Ven")  #获取name列中包含'ven'的数据,对大小写不敏感UserInfo.objects.exclude(name__icontains="ven") #不包含

range:

UserInfo.objects.filter(id__range=[1,10])   #范围,between and ,获取id在1到10范围中的数据

转载于:https://www.cnblogs.com/ccorz/p/5864470.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

农民约翰是一个惊人的会计_我的朋友约翰在CSS Grid中犯了一个错误。 不要像约翰-这样做。

农民约翰是一个惊人的会计It had been two years and John had no job.已经两年了,约翰没有工作。 John was a smart 20-something guy. Okay, he had a job — but it wasn’t one he liked. It was too monotonous and was not nearly creative enough. His day …

zip直链生成网站_手把手教你如何用飞桨自动生成二次元人物头像

【飞桨开发者说】李思佑,昆明理工大学信息与计算科学大四本科生;2018年和2019年两次获得全国大学生数学建模比赛国家二等奖;2020年美国数学建模比赛获M奖。指导老师:昆明理工大学理学院朱志宁想画出独一无二的动漫头像吗&#xff…

Gradle入门到实战(一) — 全面了解Gradle

声明:本文来自汪磊的博客,转载请注明出处 可关注个人公众号,那里更新更及时,阅读体验更好: 友情提示由于文章是从个人公众号拷贝过来整理的,发现图片没有正常显示,没关注公众号的同学可通过如下…

java 0-9所有排列_java实现:键盘输入从0~9中任意5个数,排列组合出所有不重复的组合,打印出来...

必有追加大分!!!比如1.2.3.4.5共有120个组合12345,12354,12435,12453,12534,12543;13245,13254,13425,13452,13524&#x…

智能家居物联网化将成为AWE大会最大看点

AWE大会已经在今日9点半开幕,AWE在今年将扩张至8个展馆,其整体展示规模达到11万平米,这是以往都无法匹敌的。海尔、美的、格力、海信、创维、TCL、康佳、格兰仕、澳柯玛、新飞、美菱、奥马、方太、老板、万和、万家乐、华帝、帅康、樱花、格美…

PHP 命名空间(namespace)

PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。 PHP 命名空间可以解决以下两类问题: 用户编写的代码与PHP内部的类/函数/常量…

给matrix重新列名_如何认真升级Mac终端(甚至给它一个Matrix主题)

给matrix重新列名by Marcus Gardiner通过马库斯加德纳(Marcus Gardiner) 如何认真升级Mac终端(甚至给它一个Matrix主题) (How to seriously upgrade your Mac terminal (and even give it a Matrix theme)) 蓝色药丸,红色药丸和通往极乐世界的3个步骤 (A Blue Pill…

javaweb 图书管理系统完整代码_看一名Java开发人员以红队思维五分钟审计一套代码(续)...

前言上篇文章的发布引起了很多读者的浏览,有很多读者也催更希望读到续集,作者也收获到读者的鼓励,说明这条路线对大家有帮助,是有意义的。所以,今天作者将继续阐述在审计Java代码时的思路。概述上篇文章所讲的SQL注入和…

爱立信数据分析解决方案抓住物联网发展机遇

爱立信在2016年1月6日至9日于美国拉斯维加斯举办的国际消费电子展(CES)上推出“用户和物联网数据分析”解决方案。该解决方案将能帮助运营商提高对用户和物联网终端的内部管理效率,同时探索跨越多个垂直领域的新型物联网应用。 用户和物联网数…

Lua初学习 9-12 基础

1:string 转 number :tonumber(string) 2: number 转 string :tostring(number) 3:string API: Lua中的字符串是不可变值,a "cocotang" string.gsub(a,"c","z") print(a) ----> cocotang 1获得字符串长度:string.le…

iview下拉选

问题描述:创建场景,连续创建场景时,第一个场景创建成功后,第二次进入创建窗口,点击测试任务下拉编辑只有上次创建成功的那一个任务候选,选中该任务中,关联脚本也只有上次成功创建的唯一个候选下…

JAVA实现在面板中添加图表_Java 创建PowerPoint图表并为其添加趋势线

图表,是指将既得数据用图形的方式表示出来。在前文中我们介绍过如何使用Java程序来为Excel文档创建图表的方法。本文将通过使用Java程序来演示如何创建PowerPoint图表及为图表添加趋势线。趋势线的运用能够显示数据的变化趋势,同时能够帮助预测数据的未来…

code warri_我参加了有史以来的第一届Warri Tech宣传活动。 这是我学到的。

code warriIn the city of Warri, Delta state of Nigeria, there is a saying that goes “Warri nor dey carry last, if e hard well well na draw”. This translates to “Warri is never behind in the scheme of things (events)”.在尼日利亚三角洲州的沃里市&#xff…

Socket编程小结

目录: 什么是 socket?... 1 Internet 套接字的两种类型... 1 网络理论... 2 结构体... 2 本机转换... 3 IP 地址和如何处理它们... 4 socket()函数... 4 bind()函数... 4 connect()程序... 5 listen()函数... 6 accept()函数... 6 send() and recv() 7 …

idea设置中文界面_《英雄联盟手游》设置界面中文翻译图分享 外服汉化界面一览...

导读 英雄联盟手游目前以及正式上线了,不过现在的话是没有中文版的,只有外服,所有很多地方是看不懂的,也不明白的,这样的话就需要翻译了,具体要怎么设置会比较,相关的步骤是什么呢?下…

windows 2008 r2 系统默认80端口被系统占用的处理

--windows 2008 r2 系统默认80端口被系统占用的处理 --使用netstat 命令查看指定端口netstat -ano | findstr :80----如下所示:本地的80端口被进程为4的占用 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 TCP 192.168.1.207:60652 …

java实现封装的三部_Java 封装

Java 封装在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码…

小猪短租超棒新房_freeCodeCamp讲座简介:您可以免费观看的超棒技术讲座

小猪短租超棒新房by Quincy Larson昆西拉尔森(Quincy Larson) freeCodeCamp讲座简介:您可以免费观看的超棒技术讲座 (Introducing freeCodeCamp Talks: awesome tech talks you can watch for free) Developers give thousands of tech talks every year at confer…

安卓10不支持qmc解码_官宣:安卓10已发布!21款手机已适配,小米华为率先支持...

随着今天凌晨谷歌 I/O 大会的召开,Android Q 也就是安卓10正式官宣,新版的安卓10加入了诸多新手势,从 Home 键设计上看,安卓10 的新版手势很大程度上有疑似借鉴 iOS 的手势,底部一个长条,作为 Home 用来返回…

linux系统编程之进程(七):system()函数使用【转】

本文转载自:http://www.cnblogs.com/mickole/p/3187974.html 一,system()理解 功能:system()函数调用“/bin/sh -c command”执行特定的命令,阻塞当前进程直到command命令执行完毕 原型: int system(const char *comma…