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

时间:2011-05-26 07:52:47

标签: python django field deserialization

[编辑:使用django-1.1.1 ]

您好,

我正在使用django类来存储对应于该对象图标的blob(更精确地编码的字符串b64)。

我将对象序列化为json以与不同的前端客户端进行通信。

我不想在json结果中公开纯图标blob(但是在某个url下将其作为图像提供),因此我的图标字段定义如下:

icon = models.TextField(null=True, serialize=False)

但是当保存我的对象的时候,我丢失了我的图标,因为显然,该值不是由传入的json dictionnary设置的。

我想写一个像这样的黑客:

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

对此不太满意,因为它每次都会在DB中查询,另外,如果图标实际上是无,它将无限期地递归。

另一种方法是重写反序列化器。

是否有使用django内部机制的解决方法?

2 个答案:

答案 0 :(得分: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()

它还会查询数据库,但不会导致任何递归。

答案 1 :(得分:0)

我改变了我的模型,以减少查询贪婪。

class MyIconizedClass(models.Model):
    ...
    ...


class IconClass(models.Model):
    obj = models.ForeignKey(MyIconizedClass)
    blob = models.TextField()

在处理某些url入口点(例如

)时,我只按需查询IconClass表
  • GET / iconized / 42 / icon
  • PUT / iconized / 42 / icon
  • DELETE / iconized / 42 / icon

访问对象本身时,我不需要知道图标(GET / iconized / 42)。