Как сохранить словарь по Модели Django?

Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_XXX

Случается, когда в неожиданном месте есть T_XXX токен , несбалансированные (лишние) круглые скобки, использование короткого тега без его активации в php.ini и т. д.

Вопросы, относящиеся:

Для получения дополнительной помощи см .:

  • http://phpcodechecker.com/ - что дает более полезные объяснения ваших синтаксических проблем.

50
задан Kushan Gunasekera 13 June 2019 в 18:10
поделиться

8 ответов

Если это - действительно словарь как произвольные данные, Вы ищете Вас, может, вероятно, использовать двухуровневую установку с одной моделью, это - контейнер и другая модель, это - пары "ключ-значение". Вы создали бы экземпляр контейнера, создали бы каждый из экземпляров значения ключа и связали бы набор экземпляров значения ключа с контейнерным экземпляром. Что-то как:

class Dicty(models.Model):
    name      = models.CharField(max_length=50)

class KeyVal(models.Model):
    container = models.ForeignKey(Dicty, db_index=True)
    key       = models.CharField(max_length=240, db_index=True)
    value     = models.CharField(max_length=240, db_index=True)

Это не симпатично, но это позволит Вам получать доступ/искать к внутренностям словаря с помощью DB, тогда как солить/сериализировать решение не будет.

37
ответ дан Parand 7 November 2019 в 10:48
поделиться

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

Наполняющие случайные данные в таблицу SQL не умны, если это не действительно нереляционные данные. Если это так, определите свою проблему, и мы можем быть в состоянии помочь.

2
ответ дан Daniel Naab 7 November 2019 в 10:48
поделиться

Быть "не равняется всем экземплярам модели" звукам мне как хорошее соответствие для "Базы данных без схем". CouchDB является ребенком плаката для того подхода, и Вы могли бы рассмотреть это.

В проекте я переместил несколько таблиц, которые никогда не играли очень любезный с Django ORM к CouchDB, и я довольно доволен этим. Я использую couchdb-python без любого из Django-определенных модулей CouchDB. Описание модели данных может быть найдено здесь . Перемещение из пяти "моделей" в Django к 3 "моделям" в Django и одному CouchDB "база данных" на самом деле немного уменьшило общие строки кода в моем приложении.

3
ответ дан Parag Tyagi -morpheus- 7 November 2019 в 10:48
поделиться

Я не уверен абсолютно уверенный в природе проблемы, которую Вы пытаетесь решить, но это звучит любопытно подобным Google App Engine's BigTable Expando .

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

import datetime
from google.appengine.ext import db

class Song(db.Expando):
  title = db.StringProperty()

crazy = Song(title='Crazy like a diamond',
             author='Lucy Sky',
             publish_date='yesterday',
             rating=5.0)

crazy.last_minute_note=db.Text('Get a train to the station.')

Google App Engine в настоящее время поддерживает и Python и платформу Django. Могло бы стоить изучить, если это - лучший способ выразить Ваши модели.

Традиционные модели реляционной базы данных не имеют этого вида гибкости дополнения столбца. Если Ваши типы данных достаточно просты, Вы могли бы повредиться от традиционной философии RDBMS и программистских трюков в отдельный столбец через сериализацию как , @Ned Batchelder делает предложение; однако, если Вы имеете для использования RDBMS, наследование модели Django является, вероятно, способом пойти. В частности, это создаст непосредственное отношение внешнего ключа для каждого уровня деривации.

5
ответ дан Community 7 November 2019 в 10:48
поделиться

Как Ned ответил, Вы не будете в состоянии запросить "некоторые данные" при использовании подхода словаря.

, Если все еще необходимо сохранить словари тогда, лучший подход, безусловно, является классом PickleField, зарегистрированным в новую книгу Pro Django Marty Alchin. Этот метод использует свойства класса Python, чтобы солить/не солить объект Python, только по требованию, который хранится в образцовом поле.

основы этого подхода должны использовать django's contibute_to_class метод для динамичного добавления нового поля к модели и используют getattr/setattr, чтобы сделать сериализацию по требованию.

Один из нескольких примеров онлайн я мог найти, что это подобно, это определение JSONField.

7
ответ дан Van Gale 7 November 2019 в 10:48
поделиться

Если Вы не должны запрашивать ни одними из этих дополнительных данных, то можно сохранить их как сериализированный словарь . Используйте repr для превращения словаря в строку, и eval для возвращения строки в словарь. Заботьтесь с оценкой, что нет никаких пользовательских данных в словаре, или используйте safe_eval реализация.

, Например, в create и update методы Вашего views, можно добавить:

if isinstance(request.data, dict) == False:
    req_data = request.data.dict().copy()
else:
    req_data = request.data.copy()

dict_key = 'request_parameter_that_has_a_dict_inside'
if dict_key in req_data.keys() and isinstance(req_data[dict_key], dict):
    req_data[dict_key] = repr(req_data[dict_key])
15
ответ дан Philippe Fanaro 7 November 2019 в 10:48
поделиться

Django-Geo includes a "DictionaryField" you might find helpful:

http://code.google.com/p/django-geo/source/browse/trunk/fields.py?r=13#49

In general, if you don't need to query across the data use a denormalized approach to avoid extra queries. User settings are a pretty good example!

2
ответ дан 7 November 2019 в 10:48
поделиться

Я согласен с тем, что вам нужно воздержаться от вставки других структурированных данных в один столбец. Но если вы должны это сделать, Django имеет встроенную функцию XMLField .

Также есть JSONField в фрагментах Django.

3
ответ дан 7 November 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: