Django 反序列化器,字段设置为 serialize=False

1 投票
2 回答
905 浏览
提问于 2025-04-16 18:22

[编辑: 使用 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()

这个方法也会查询数据库,但不会引起任何递归问题。

撰写回答