Перейти к содержимому

Jsonfield django как использовать

  • автор:

Python-сообщество

[RSS Feed]

  • Начало
  • » Django
  • » Как правильно добавить большое количество атрибутов к объекту модели?

#1 Март 9, 2013 20:24:28

MikaMika Зарегистрирован: 2012-11-07 Сообщения: 51 Репутация: 0 Профиль Отправить e-mail

Как правильно добавить большое количество атрибутов к объекту модели?

Привет.
Ребята подскажите как правильнее решить следующую задачу.
Есть объект, пусть это будет камень.
Объект представлен классом модели:

class Stone(models.Model): name = models.CharField() 

У этого объекта есть множество атрибутов: цвет, форма, размер, вес и т.д.
Эти атрибуты почти никогда не меняются!
Самое простое, что можно сделать это несколько классов: Color, StoneForm, Size и т.д., описать значение атрибутов в них, а в классе Stone поставить ForeingKey() на нужные классы.
Но я хотел бы сохранить в модели нечто такое:

 'colors': ['red', 'green', 'blue'], 'stone_form':['round', 'square', 'convex'], 'size': ['small', 'medium', 'large'] > 

Создать словарь, записать в него необходимые атрибуты и значения и записать в поле модели.
Хотел бы узнать, что для этого лучше использовать?
Встроенный pickle или jsonField?
А если jsonField, то где лучше скачать или писать самому?
Или всё же оставить вариант с классами модели, ведь у него тоже есть свои преимущества.

Отредактировано MikaMika (Март 9, 2013 20:25:29)

#2 Март 10, 2013 17:13:28

alafin Root От: Киев, Украина Зарегистрирован: 2006-04-06 Сообщения: 756 Репутация: 3 Профиль Отправить e-mail

Как правильно добавить большое количество атрибутов к объекту модели?

MikaMika, все зависит от задачи и как в будущем планируется использовать данный функционал.

1) Если все будете хранить в таблицах (Color, StoneForm, Size):
Плюсы: сможете нормально фильтровать записи (если вам конечно это нужно будет для задачи)
Минусы: Нужно создавать для задачи дополнительные таблицы (Color, StoneForm, Size)
2) Если будете хранить записи в JSONField-е (на основе TextField-а)
Плюсы: колонки в таблице будут храниться в читабельном виде (JSON)
Минусы: невозможно будет нормально фильтровать в запросах записи
3) Если будете хранить записи в PickleField:
Плюсы: вменяемых плюсов не знаю 🙂
Минусы: нечитабельный вид хранения в базе
4) В Postgres-е в версии 9.2 появился JSONField можно взглянуть и на него.

О Python с Игорем Давыденко

Всякое разное о Python, раньше было про Django/Flask, сейчас больше про Fast Python и asyncio.

13 февраля 2009 г.

Простой и работающий JSONField для Django

Не успел, я починить PickleField для Django, мне понадобилось создать JSONField . Задача оказалась решенной на раз/два, плюс ко всему добавился маленький и полезный виджет для JSONField ‘а, который показывает красиво отформатированный JSON в textarea . Сразу скажу, что contribute_to_class метод чуть менне, чем полностью, скопипастен с снипетта 377.

from django.conf import settings from django.forms.widgets import Textarea from django.db.models import SubfieldBase, TextField from django.utils import simplejson class JSONField(TextField): __metaclass__ = SubfieldBase def contribute_to_class(self, cls, name): super(JSONField, self).contribute_to_class(cls, name) def get_json(model): return self.get_db_prep_value(getattr(model, self.attname)) setattr(cls, 'get_%s_json' % self.name, get_json) def set_json(model, json): setattr(model, self.attname, self.to_python(json)) setattr(cls, 'set_%s_json' % self.name, set_json) def formfield(self, **kwargs): kwargs['widget'] = JSONWidget(attrs=) return super(JSONField, self).formfield(**kwargs) def get_db_prep_value(self, value): return simplejson.dumps(value) def to_python(self, value): if not isinstance(value, basestring): return value try: return simplejson.loads(value, encoding=settings.DEFAULT_CHARSET) except ValueError, e: # If string could not parse as JSON it's means that it's Python # string saved to JSONField. return value class JSONWidget(Textarea): """ Prettify dumps of all non-string JSON data. """ def render(self, name, value, attrs=None): if not isinstance(value, basestring) and value is not None: value = simplejson.dumps(value, indent=4, sort_keys=True) return super(JSONWidget, self).render(name, value, attrs)

Ну и пару примеров использования, напоследок:

>>> # Пусть у нас есть простая модель >>> class Sample(models.Model): . name = models.CharField(max_length=16) . data = JSONField() >>> # Создадим модель и сохраним в data поле настройки для ShadowBox >>> sb = Sample.objects.create(name='ShadowBox', . data=) >>> # Теперь мы хотим напечатать эти настройки где-то в шаблоне >>> sb.get_data_json() '' >>> # Вспомним, что нам вообщем-то не зачем кастомное значение для overlayOpacity >>> del sb.data['overlayOpacity'] >>> sb.save() >>> # И опять напечатаем настройки в шаблоне >>> sb.get_data_json() ''

зы. ShadowBox — это лучший лайтбокс для любого JavaScript фреймворка, имо.

Простой и работающий JSONField для Django

Не успел, я починить PickleField для Django, мне понадобилось создать JSONField . Задача оказалась решенной на раз/два, плюс ко всему добавился маленький и полезный виджет для JSONField ‘а, который показывает красиво отформатированный JSON в textarea . Сразу скажу, что contribute_to_class метод чуть менне, чем полностью, скопипастен с снипетта 377.

from django.conf import settings from django.forms.widgets import Textarea from django.db.models import SubfieldBase, TextField from django.utils import simplejson class JSONField(TextField): __metaclass__ = SubfieldBase def contribute_to_class(self, cls, name): super(JSONField, self).contribute_to_class(cls, name) def get_json(model): return self.get_db_prep_value(getattr(model, self.attname)) setattr(cls, 'get_%s_json' % self.name, get_json) def set_json(model, json): setattr(model, self.attname, self.to_python(json)) setattr(cls, 'set_%s_json' % self.name, set_json) def formfield(self, **kwargs): kwargs['widget'] = JSONWidget(attrs=) return super(JSONField, self).formfield(**kwargs) def get_db_prep_value(self, value): return simplejson.dumps(value) def to_python(self, value): if not isinstance(value, basestring): return value try: return simplejson.loads(value, encoding=settings.DEFAULT_CHARSET) except ValueError, e: # If string could not parse as JSON it's means that it's Python # string saved to JSONField. return value class JSONWidget(Textarea): """ Prettify dumps of all non-string JSON data. """ def render(self, name, value, attrs=None): if not isinstance(value, basestring) and value is not None: value = simplejson.dumps(value, indent=4, sort_keys=True) return super(JSONWidget, self).render(name, value, attrs)

Ну и пару примеров использования, напоследок:

>>> # Пусть у нас есть простая модель >>> class Sample(models.Model): . name = models.CharField(max_length=16) . data = JSONField() >>> # Создадим модель и сохраним в data поле настройки для ShadowBox >>> sb = Sample.objects.create(name='ShadowBox', . data=) >>> # Теперь мы хотим напечатать эти настройки где-то в шаблоне >>> sb.get_data_json() '' >>> # Вспомним, что нам вообщем-то не зачем кастомное значение для overlayOpacity >>> del sb.data['overlayOpacity'] >>> sb.save() >>> # И опять напечатаем настройки в шаблоне >>> sb.get_data_json() ''

зы. ShadowBox — это лучший лайтбокс для любого JavaScript фреймворка, имо.

Django JSONField: руководство по эффективной обработке данных

Play video

Новое поле JSONField в Django позволяет вам использовать JSON в любой базе данных, даже если база данных изначально не поддерживает JSON.

Django автоматически преобразует данные JSON в объект словаря, упрощая взаимодействие с данными и манипулирование ими.

При использовании JSONField в Django важно обеспечить согласованность передаваемых данных для поддержания структуры и целостности базы данных.

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

Как правильно прописать json структуру в models.py проекта django с помощью JSONField?

БД моего проекта — MongoDB, для соединения mongo и проекта django (использую версию 4.0.1) я использую движок «djОngo». Соединение с базой работает корректно.
Я хочу хранить в MongoDB данные, получаемые из внешнего API либо записанные через форму на странице сайта, которые могут иметь вложенные списки, или иногда вложенные объекты.
Пример json структуры которая будет записываться через форму и приходить по API:

"FormsID": 1, "make": < "1_new": 21, "2_new": 16, "right": 80, "left": 10, >, "static": [ < "name": " 1", "number": 1, "id":93, "day": < "start": 7, "end": 23,>>]

На данный момент задача реализована частично, объясняю. Мой файл models.py:

from djongo import models class StaticForms(models.Model): FormsID=models.ObjectIdField(primary_key=True) make = models.JSONField() static=models.JSONField() day=models.JSONField()

Далее уже в файле views.py я добавляю нужные ключи уже в make, static и day.
Мой файл views.py:

from django.views.decorators.csrf import csrf_exempt from django.http.response import JsonResponse, HttpResponse from FirstApp.models import StaticForms @csrf_exempt def forms_post(request): make = static = day = post = StaticForms(FormsID=request.POST.get("FormsID"), make=make, static=static, day=day) post.save() return HttpResponse("Inserted")

После добавления данных через Postman я получаю следующую JSON структуру. (отличается от требуемой):

"make": < "1_new": 21, "2_new": 16, "right": 80, "left": 10, >, "static": < "name": " 1", "number": 1, "id":93>"day":

1) Как мне вложить dict «day» в dict «static» чтобы получилось, как в моем первом примере?
2) почему отсутствует поле «FormsID»?

  • Вопрос задан более года назад
  • 203 просмотра

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *