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

 平常查找表中数据的条件是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"]

django中两张表有外键关系的相互查找方法,自定义json编码方法的更多相关文章

  1. oracle查询某张表的外键,并用 truncate 命令有外键的表中的数据

    注:本文来源于<oracle查询某张表的外键(最终解决办法)> 一:几个查询表外键的脚本 select b.table_name, b.column_name from user_cons ...

  2. Django——ContentType(与多个表建立外键关系)及ContentType-signals的使用

    一.ContentType 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的 ...

  3. 给已有数据的oracle表建立外键关系

    PS:这里是给自己做个备忘,下次遇到同类问题的时候,方便查找: 客户在有主外键关系的2张表进行页面删除时报错已有子记录,运维后台处理的时候应该找出相应的数据,先删除子记录,在删主表记录:但客户要的急, ...

  4. 6.10---mybatis中两张表查询数据dao层

  5. .NET MVC 表主外键关系 JSON 无限循环 方案二(推荐)

    public class JsonResultObject:JsonResult { private Newtonsoft.Json.JsonSerializerSettings Settings { ...

  6. MySQL表存在外键关系无法清空数据的解决方案

    先 SET FOREIGN_KEY_CHECKS=0; 然后delete删除,再 SET FOREIGN_KEY_CHECKS=1;

  7. 使用ContentType处理大量的外键关系

    问题分析 在之前的一个商城的项目中使用了mysql, 提到mysql就是外键, 多对多等等一系列的表关系 因为是一个商城的项目, 这里面有优惠券, 商品有很多的分类, 不同的商品又有不同的优惠券 其实 ...

  8. EF Core中如何正确地设置两张表之间的关联关系

    数据库 假设现在我们在SQL Server数据库中有下面两张表: Person表,代表的是一个人: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ...

  9. Django中的跨表查询,多表查询。

    一:Django中的ORM进行操作. 必须掌握的十三条: <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

随机推荐

  1. 去除zabbix calculate 模式下,有时候分母为零的情况(Cannot evaluate expression: division by zero. )

    zabbix的监控类型支持一种calculate的方式,可以对几个item结果进行简单的计算,但有时会出现分母为零的情况,这时候监控项就会报错 Cannot evaluate expression: ...

  2. 关于UNIX的exec函数

    在UNIX系统中,系统为进程相关提供了一系列的控制原语,包括:进程fork,进程exit,进程exec,进程wait等服务. 该篇文章主要与进程exec服务有关,并记录了几个需要注意留意的点. 照例给 ...

  3. vue引入jquery的方法

    1.局部引入 通过命令下载jquery   npm install jquery --save-dev 在需要引入jquery的组件中通过import $ from 'jquery'引入即可 2.全局 ...

  4. 利用python编写不同环境下都能运行的测试脚本

    利用bash来获取当前电脑的环境变量,可以写一个.sh文件,里面获取当前环境,然后在调用python文件执行 # -*- coding: utf-8 -*- import logging import ...

  5. Max Sum Plus Plus (动态规划) HDU1024

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1024 (http://www.fjutacm.com/Problem.jsp?pid=1375) 题意 ...

  6. Shell中三种引号的用法及区别

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...

  7. linux音频alsa-uda134x驱动文档阅读之一转自http://blog.csdn.net/wantianpei/article/details/7817293

    前言 目前,linux系统常用的音频驱动有两种形式:alsa oss alsa:现在是linux下音频驱动的主要形式,与简单的oss兼容.oss:过去的形式而我们板子上的uda1341用的就是alsa ...

  8. MongoDB-MongoDB重装系统后恢复

    重装系统后,把原mongoDB安装目录和原mongoDB的data目录拷贝到新硬盘的D盘上. 恢复的方法如下. 1.D:\Mongodb里放着mongod.cfg和data C:\Users\Admi ...

  9. 使用qshell备份七牛云存储文件

    qshell是利用七牛文档上公开的API实现的一个方便开发者测试和使用七牛API服务的命令行工具.我们可以利用它来将七牛云上存储的文件备份到本地. 它提供Mac OSX, Linux, Windows ...

  10. CF 983B 序列函数

    CF 983B 序列函数 一道本校神仙wucstdio出的毒瘤签到题. 题意: 给你一段序列,求出它们的最大异或和. 解法: 其实这道题并不很难,但读题上可能会有困难. 其实样例我是用Python 3 ...