djang模型类中BinaryField字段的序列化输出问题和外键问题

最近在项目开发时进行模型类设计时遇到了一些问题,在这里和大家分享以下

1.BinaryField字段的序列化输出问题

项目经理的需求是将多个不同数据库的查询结果信息存放到另一个关系型数据库(比如mysql1)中,那么多个数据库的查询信息的字段上,类型上都不相同,这导致我在存储数据库(mysql1)中无法顶一个各个字段,所以我就需要将查询结果当作一个大字段存入到一个字段中,但是因为查询结果的长度不可控,且后期数据可能大量扩展,所以如果按照CharFiled的方式存储就很不方便了,因为CharField需要定义长度,不利于扩展,不方便大数据使用,所以想到了file和binary,此处需求没必要使用file,所以最后使用BinaryFiled(看需求选择),那么在选择BinaryFiled之后,存储时需要进行数据的encode,因为BinaryFiled只能进行二进制存储,但是在输出时,因为我之前使用的序列化器继承了Modelserializer,导致输出字段直接按照存储方式序列化输出,没有进行deocde,所以乱码了,然后我就进行BinaryFiled自定义输出,但是一直不起作用,依然输出乱码,那么我分析了问题的根本在哪里

,于是我在取出数据后和序列化之前,以及序列化之后对比,发现问题就出现在序列化器上,我要做的就是在序列化器之前将数据进行decode,那么我查看serializers源代码时发现,当我们继承Modelserializer时,程序自动按照class Meta的元类中指定的模型类进行序列化和输出,自定义的输出对象根本不执行,所以需要进行父类重选,可以使用Serializer来继承,这样的话保留了序列化的功能,同时可以进行输出对象的重新,当然了,serializers中只提供了四个可以常用输出的字段IntegerFiled,CharField,BooleanField,DateTimeField,我选择了CharFiled,问题最后解决了

2.外键的原理

我们一个表中使用了UUID作为主键,我们姑且称这个表为list1

我们的另一个表,姑且称为list2,lsit2以list1_id为外键,那么我们做创建数据时,将list1的id存储到list中时发现存储错误,显示uuid无法存储,不是list1的属性,我对这个问题一直纠结于uuid是否能做外键,和uuid的存储上,当时也是一时懵了,咱们仔细想一下这个原理,那么一个表中的外键指定另一个表,指向的是另一个表的对象,而不是它的一个ID,所以我要将id存入list2中,list1根本不知道自己指向的是哪一个对象,那么就需要通过外键保存list的一个对象和不是id来进行保存,这样就成功了!

猜你喜欢

转载自blog.csdn.net/fsj818077/article/details/82253586
今日推荐