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安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
numpy中索引和切片详解
Dec 15 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
在python里面运用多继承方法详解
Jul 01 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
python加载自定义词典实例
Dec 06 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
PyQt5实现画布小程序
May 30 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 Python
Python实现自动玩连连看的脚本分享
Apr 04 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
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
PHP分页类集锦
2014/11/18 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
JS实现在线ps功能详解
2019/07/31 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
python类继承用法实例分析
2014/10/10 Python
python控制台中实现进度条功能
2015/11/10 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
由面试题加深对Django的认识理解
2019/07/19 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
艺术设计专业个人求职信
2014/04/10 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
教师业务学习材料
2014/12/16 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript