django中两张表有外键关系的相互查找方法,自定义json编码方法
两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集?
平常查找表中数据的条件是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编码方法的更多相关文章
- oracle查询某张表的外键,并用 truncate 命令有外键的表中的数据
注:本文来源于<oracle查询某张表的外键(最终解决办法)> 一:几个查询表外键的脚本 select b.table_name, b.column_name from user_cons ...
- Django——ContentType(与多个表建立外键关系)及ContentType-signals的使用
一.ContentType 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的 ...
- 给已有数据的oracle表建立外键关系
PS:这里是给自己做个备忘,下次遇到同类问题的时候,方便查找: 客户在有主外键关系的2张表进行页面删除时报错已有子记录,运维后台处理的时候应该找出相应的数据,先删除子记录,在删主表记录:但客户要的急, ...
- 6.10---mybatis中两张表查询数据dao层
- .NET MVC 表主外键关系 JSON 无限循环 方案二(推荐)
public class JsonResultObject:JsonResult { private Newtonsoft.Json.JsonSerializerSettings Settings { ...
- MySQL表存在外键关系无法清空数据的解决方案
先 SET FOREIGN_KEY_CHECKS=0; 然后delete删除,再 SET FOREIGN_KEY_CHECKS=1;
- 使用ContentType处理大量的外键关系
问题分析 在之前的一个商城的项目中使用了mysql, 提到mysql就是外键, 多对多等等一系列的表关系 因为是一个商城的项目, 这里面有优惠券, 商品有很多的分类, 不同的商品又有不同的优惠券 其实 ...
- EF Core中如何正确地设置两张表之间的关联关系
数据库 假设现在我们在SQL Server数据库中有下面两张表: Person表,代表的是一个人: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ...
- Django中的跨表查询,多表查询。
一:Django中的ORM进行操作. 必须掌握的十三条: <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...
随机推荐
- JavaScript 优雅的实现方式包含你可能不知道的知识点
有些东西很好用,但是你未必知道:有些东西你可能用过,但是你未必知道原理. 实现一个目的有多种途径,俗话说,条条大路通罗马.很多内容来自平时的一些收集以及过往博客文章底下的精彩评论,收集整理拓展一波,发 ...
- 用C代码简要模拟实现一下RPC(远程过程调用)并谈谈它在代码调测中的重要应用【转】
转自:http://blog.csdn.net/stpeace/article/details/44947925 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则 ...
- 使用ubifs格式的根文件系统
配置内核,使其支持ubifs文件系统 1)Device Drivers --->Memory Technology Device (MTD) support --->UBI - Uns ...
- JS Ajax异步请求发送列表数据后面多了[]
还在苦逼的写代码,这里就不详细了,直接抛出问题: 如图所示: 前端ajax请求向后端发送数据的时候,给key添加了[]出现很多找不到原因, 后面在说 解决方法: 暂时先这样记录一下,下次方便查找,好了 ...
- 20165203《Java程序设计》第八周学习总结
20165203<Java程序设计>第八周学习总结 教材学习内容总结 第12章 进程与线程 进程的完成过程:代码加载.执行至执行完毕 线程:一个进程由多个线程组成. 线程的完成过程:自身的 ...
- 一步一步学习IdentityServer3 (5)
这篇文章介绍下数据持久化问题,官方例子可能都是缓存数据 Client User Scope 下面介绍下怎么使用数据库持久化 这里需要导入nuget包 :IdentityServer3.EntityF ...
- AutoCompleteTextView,Spinner,消息提示
package com.example.wang.testapp2; import android.app.Notification; import android.app.NotificationM ...
- .size和.empty
坑爹的list容器size方法--为了splice居然把复杂度设计为O(N)? 能用empty的时候,不要用size empty可以保证常量复杂度,但list的size不保证 链表长度必须要遍历全部的 ...
- python开发学习-day16(Django框架初识)
s12-20160507-day16 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- USACO 6.5 Betsy's Tour (插头dp)
Betsy's TourDon Piele A square township has been divided up into N2 square plots (1 <= N <= 7) ...