django有外键关系的两张表如何相互查找


Posted in Python onFebruary 10, 2020

这篇文章主要介绍了django有外键关系的两张表如何相互查找,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集?

平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找。如果条件是表中外键列所对应表的某一列,该如何查询数据?

表1是新闻表,是回复表中某一外键指向的表,表2是回复表。

问题1:根据表1的某些条件来查找表2的对象集。

class News(models.Model):
 title = models.CharField(max_length=50);
 summary = models.TextField();
 
 url = models.CharField(max_length=150);
 favorCount = models.IntegerField(default=0);
 favorUsername = models.TextField(default="");
 replyCount = models.IntegerField(default=0);

class Reply(models.Model):
 content = models.TextField();
 user = models.ForeignKey('User');
 newID = models.ForeignKey('News');
 replyTime = models.DateTimeField(auto_now_add=True);
 
 def __unicode__(self):
  return self.content;

像这样的数据表,想要查找对于新闻id是3的所有回复?

方法一、首先获得外键指向的表中对象,然后通过‘_set'这样的方法获得目标表中的数据。

obj = models.News.objects.get(id=3)
replys = obj.reply_set.all()

方法二、直接在目标表中通过双下划线来指定外键对应表中的域来查找符合条件的对象。

models.Reply.objects.filter(newID__id=3)

问题2: 根据表2的某些条件查找表1的对象集。此时需要将表2的名字小写加两个下划线,再加上查找条件。比如:查找回复内容中包含“new”的所有新闻

models.News.objects.filter(reply__content__contains='new');

在filter中可以这样用,在values方法中也可以这样使用,此时的值便是外键对应表中的数据。

2.在使用django中避免不了要跟前台进行数据交互,而python中的数据类型丰富,比如datetime模块的datetime类型就不可以json编码,如果想要继续json格式化,有两种方法可以解决,

1)使用django提供的格式化

2)自己编写编码器或默认处理函数。

注意:pyhton中json只会编码python中自己的数据类型,比如数字、字符串、元组、列表、字典等。在django中处理数据经常遇到queryset这类数据,需要先将他转化成列表再json编码。[list(queryset)]
方法一、所以需要更强劲的django.core提供的serializers.serialize方法,一般使用json格式就是serializers.serialize('json',data)。可以很方便的将django中所有数据类型进行json格式编码。

方法二、自己编写编码器或者写默认处理函数

1)写自己的编码器类

class MyJSONEncoder(json.JSONEncoder):
 def default(self, obj):
  if isinstance(obj, datetime.datetime):
   return (datetime.timedelta(hours=8)+obj).strftime('%Y-%m-%d %H:%M:%S');
  elif isinstance(obj, datetime.date):
   return obj.strftime("%Y-%m-%d")
  else:
   return json.JSONEncoder.default(self, obj)

2)写自己的默认处理函数

def myDumps(obj):
 if isinstance(obj, datetime.datetime):
  return (datetime.timedelta(hours=8)+obj).strftime('%Y-%m-%d %H:%M:%S');
 else:
  return json.dumps(obj);

对其进行测试

t = datetime.datetime.utcnow();
 a=[1,2,43,56]; 
 print json.dumps(t,default=myDumps);
 print json.dumps(a,default=myDumps);
 a.extend([t,t+datetime.timedelta(hours=8)]);
 print json.dumps(t,default=myDumps);
 print json.dumps(a,cls=MyJSONEncoder);

测试结果

"2016-06-26 09:53:03"
[1, 2, 43, 56]
"2016-06-26 09:53:03"
[1, 2, 43, 56, "2016-06-26 09:53:03", "2016-06-26 17:53:03"]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
Aug 15 Python
python的类方法和静态方法
Dec 13 Python
Python实现遍历目录的方法【测试可用】
Mar 22 Python
Python中实现switch功能实例解析
Jan 11 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
python分别打包出32位和64位应用程序
Feb 18 Python
如何使用python切换hosts文件
Apr 29 Python
Keras中的两种模型:Sequential和Model用法
Jun 27 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Python常用库Numpy进行矩阵运算详解
Jul 21 Python
Django重设Admin密码过程解析
Feb 10 #Python
tensorflow实现训练变量checkpoint的保存与读取
Feb 10 #Python
Python单元测试模块doctest的具体使用
Feb 10 #Python
简单了解django文件下载方式
Feb 10 #Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 #Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 #Python
解决tensorflow添加ptb库的问题
Feb 10 #Python
You might like
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
layui的select联动实现代码
2019/09/28 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
python添加菜单图文讲解
2019/06/04 Python
tensorflow 变长序列存储实例
2020/01/20 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
python爬取招聘要求等信息实例
2020/11/20 Python
python推导式的使用方法实例
2021/02/28 Python
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
大学生如何写自荐信
2014/01/08 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书