Случается, когда в неожиданном месте есть T_XXX
токен , несбалансированные (лишние) круглые скобки, использование короткого тега без его активации в php.ini и т. д.
Вопросы, относящиеся:
Для получения дополнительной помощи см .:
Если это - действительно словарь как произвольные данные, Вы ищете Вас, может, вероятно, использовать двухуровневую установку с одной моделью, это - контейнер и другая модель, это - пары "ключ-значение". Вы создали бы экземпляр контейнера, создали бы каждый из экземпляров значения ключа и связали бы набор экземпляров значения ключа с контейнерным экземпляром. Что-то как:
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, тогда как солить/сериализировать решение не будет.
Обдумайте его и найдите, что общности каждого набора данных... тогда определяют Вашу модель. Это может потребовать использования подклассов или нет. Внешних ключей, представляющих общности, нельзя избежать, но поощрить, когда они имеют смысл.
Наполняющие случайные данные в таблицу SQL не умны, если это не действительно нереляционные данные. Если это так, определите свою проблему, и мы можем быть в состоянии помочь.
Быть "не равняется всем экземплярам модели" звукам мне как хорошее соответствие для "Базы данных без схем". CouchDB является ребенком плаката для того подхода, и Вы могли бы рассмотреть это.
В проекте я переместил несколько таблиц, которые никогда не играли очень любезный с Django ORM к CouchDB, и я довольно доволен этим. Я использую couchdb-python без любого из Django-определенных модулей CouchDB. Описание модели данных может быть найдено здесь . Перемещение из пяти "моделей" в Django к 3 "моделям" в Django и одному CouchDB "база данных" на самом деле немного уменьшило общие строки кода в моем приложении.
Я не уверен абсолютно уверенный в природе проблемы, которую Вы пытаетесь решить, но это звучит любопытно подобным 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 является, вероятно, способом пойти. В частности, это создаст непосредственное отношение внешнего ключа для каждого уровня деривации.
Как Ned ответил, Вы не будете в состоянии запросить "некоторые данные" при использовании подхода словаря.
, Если все еще необходимо сохранить словари тогда, лучший подход, безусловно, является классом PickleField, зарегистрированным в новую книгу Pro Django Marty Alchin. Этот метод использует свойства класса Python, чтобы солить/не солить объект Python, только по требованию, который хранится в образцовом поле.
основы этого подхода должны использовать django's contibute_to_class
метод для динамичного добавления нового поля к модели и используют getattr/setattr, чтобы сделать сериализацию по требованию.
Один из нескольких примеров онлайн я мог найти, что это подобно, это определение JSONField.
Если Вы не должны запрашивать ни одними из этих дополнительных данных, то можно сохранить их как сериализированный словарь . Используйте 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])
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!
Я согласен с тем, что вам нужно воздержаться от вставки других структурированных данных в один столбец. Но если вы должны это сделать, Django имеет встроенную функцию XMLField .
Также есть JSONField в фрагментах Django.