Сохранение больших json-объектов в postgres, Django

У меня есть модель в db:

class Test(models.Model):
    title = models.CharField(max_length=32, verbose_name='title', default='')
    json = models.JSONField(default=dict)
    ...

Я получаю данные с фронта и сохраняю их в бд, запросы приходят довольно часто. Средний вес json поля 10MB, но он может сильно варьироваться и я не понимаю как мне лучше его сохранить и отдать, я не делаю никакой работы с json на сервере. Для начала я думаю нужно сжать этот json и сохранить в БД, а при запросе на получение распаковать. Подскажите, пожалуйста, как лучше сэкономить память и время выполнения запроса.

Кроме того, стоит ли удалять этот json в отдельную таблицу, чтобы изменение других данных в тестовой таблице занимало меньше времени, или лучше использовать Test.objects.update()?

Хотя я понимаю, что это не самое простое решение и уж точно не самое быстрое или легкое, однако хранение "больших json-блобов" в базе данных, вероятно, никогда не будет хорошей идеей.

Если у вас есть большой объект и вам нужно представить эти данные в модели django, то я бы предложил вам сделать именно это.

Вместо того, чтобы пытаться сохранить весь json blob как одну строку, а затем загружать его из базы данных и затем в память каждый раз, когда вы хотите прочитать один атрибут? Это имеет огромные последствия для производительности, которые будет трудно уменьшить без какой-либо формы кэширования.

Если вы РЕАЛЬНО ДОЛЖНЫ хранить данные в виде целого json-блоба, то, вероятно, лучше хранить их в самой файловой системе, а затем создать модель, которая имеет FileField вместо JSONField

Вы также можете сделать то, что было бы гораздо более, Pythonic / Django-esque, что было бы препарированием вашего объекта, каждого из его атрибутов и его значений, а затем разработать ваши модели так, чтобы они могли хранить каждый из типов данных. В качестве простого примера:

{
    'field_a': 'string_value',
    'm2m_field_b': [
        {
            'field_c': 6.4,
            'field_d': 'other string values'
        }
    ]
    ...
 }

У вас здесь 2 или потенциально больше, в зависимости от сложности json-блоба.

  1. ParentModelA 1a) field_a - строковое поле
  2. ChildModelA 2a) fk поле к родительскому объекту 2b) field_c является полем float (предпочтительно, Decimal) и находится в нашей связанной модели 2c) field_d - это другое строковое поле и опять же находится на нашей родственной модели.

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

Зачем вам заходить так далеко, спросите вы? Кажется, что это много работы без особой пользы? Для неподготовленного глаза - да, без обид. Вы должны принять во внимание тот факт, что вы не сможете использовать полезные взаимодействия django с базой данных, такие как агрегация, или prefetch и select related, так что вы потеряете многие преимущества и рычаги воздействия, которые может предложить API базы данных django.

Также примите во внимание, если вы хотите загрузить одно из значений поля на простой странице, чтобы отобразить данные пользователю в пользовательском интерфейсе.

В вашей модели необходимо загрузить весь json-блок, затем отобразить простую строку и десятичное значение.

Если у вас есть набор моделей, вы можете обходить связанные поля djangos и даже использовать объекты непосредственно в шаблоне, используя обычную точечную нотацию.

Вернуться на верх