Сохранение больших 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-блоба.
ParentModelA
1a)field_a
- строковое полеChildModelA
2a) fk поле к родительскому объекту 2b)field_c
является полем float (предпочтительно, Decimal) и находится в нашей связанной модели 2c)field_d
- это другое строковое поле и опять же находится на нашей родственной модели.
Я знаю, сначала это звучит очень сложно, но как только вы начнете разбираться в моделировании этих типов объектов, вы поймете, что все повторяется, и вам не нужно будет писать так много дополнительного кода.
Зачем вам заходить так далеко, спросите вы? Кажется, что это много работы без особой пользы? Для неподготовленного глаза - да, без обид. Вы должны принять во внимание тот факт, что вы не сможете использовать полезные взаимодействия django с базой данных, такие как агрегация, или prefetch и select related, так что вы потеряете многие преимущества и рычаги воздействия, которые может предложить API базы данных django.
Также примите во внимание, если вы хотите загрузить одно из значений поля на простой странице, чтобы отобразить данные пользователю в пользовательском интерфейсе.
В вашей модели необходимо загрузить весь json-блок, затем отобразить простую строку и десятичное значение.
Если у вас есть набор моделей, вы можете обходить связанные поля djangos и даже использовать объекты непосредственно в шаблоне, используя обычную точечную нотацию.