Django 反序列化器,字段设置为 serialize=False
[编辑: 使用 django-1.1.1]
你好,
我正在使用 Django 的类来存储一个图标的二进制数据(更准确地说,是一个经过 Base64 编码的字符串)。这个图标是和某个对象对应的。
我把这些对象转换成 JSON 格式,以便和不同的前端客户端进行沟通。
我不想在 JSON 结果中直接暴露这个图标的二进制数据(而是希望通过某个网址来提供这个图像),所以我把图标字段定义成这样:
icon = models.TextField(null=True, serialize=False)
但是,当我想保存这个对象的时候,我的图标就丢失了,因为显然,传入的 JSON 字典中并没有设置这个值。
我想写一个小技巧来解决这个问题:
class MyIconizedClass(models.Model):
def __init__(self, *args, **kwargs):
if self.pk is not None and self._icon is None:
old_self = MyIconizedClass.object.get(pk=self.pk)
self.icon = old.self.icon
不过我对此不是很满意,因为这样每次都会查询数据库,而且如果图标确实是 None 的话,会导致无限递归。
另一种方法是重写反序列化器。
有没有什么其他的解决办法,可以利用 Django 的内部机制呢?
2 个回答
0
我修改了我的模型,让它在查询时不那么贪心。
class MyIconizedClass(models.Model):
...
...
class IconClass(models.Model):
obj = models.ForeignKey(MyIconizedClass)
blob = models.TextField()
我只在需要的时候查询IconClass表,比如在处理某些特定的URL入口时,例如:
- GET /iconized/42/icon
- PUT /iconized/42/icon
- DELETE /iconized/42/icon
当我访问这个对象本身时,我并不需要知道图标的情况(GET /iconized/42)。
1
试试这个:
for deserialized_object in serializers.deserialize("json", data):
try:
existing_object = MyIconizedClass.objects.get(pk=deserialized_object.pk)
deserialized_object.icon = existing_object.icon
except MyIconizedClass.DoesNotExist:
pass
deserialized_object.save()
这个方法也会查询数据库,但不会引起任何递归问题。