Десериализатор Django, с полями, установленными как serialize = False - PullRequest
1 голос
/ 26 мая 2011

[править: с использованием django-1.1.1 ]

Здравствуйте,

Я использую классы django, в которых хранится большой двоичный объект (точнее строка b64), соответствующая значку объекта.

Я сериализую объекты как json для связи с различными внешними клиентами.

Я не хочу показывать чистый значок в виде результата json (но служить им как изображение под определенным URL-адресом), поэтому мое поле значка определяется следующим образом:

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

Не очень доволен этим, потому что он будет каждый раз запрашивать в БД, плюс, он будет повторяться бесконечно, если иконка фактически отсутствует.

Другим способом было бы переписать десериализатор.

Есть ли обходной путь, используя внутренние механизмы django?

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Попробуйте:

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()

Он также запрашивает базу данных, но не вызывает рекурсии.

0 голосов
/ 26 апреля 2013

Я изменил свою модель, чтобы она стала менее жадной к запросам.

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
  • УДАЛИТЬ / iconized / 42 / icon

При доступе к самому объекту мне не нужно знать значки (GET /iconized/42).

...